WebStorm Mocha : tests are always pending - mocha.js

I followed the WebStorm video on how to setup Mocha in WebStorm:
https://www.youtube.com/watch?time_continue=81&v=4mKiGkokyx8
I created a very simple test with a pass and a fail:
var assert = require("assert")
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -'), function() {
assert.equal(-1, [1,2,3].indexOf(5))
}
it('should fail'), function() {
assert.equal(1, [1,2,3].indexOf(5))
}
})
})
I then setup a run configuration like this:
And then I run it. It just states that the tests are 'pending' and then the process completes:
Why is this happening?

Your both tests are ignored, because you are using incorrect it() syntax. Please try changing your suite as follows:
var assert = require("assert")
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -', function() {
assert.equal(-1, [1,2,3].indexOf(5))
})
it('should fail', function() {
assert.equal(1, [1,2,3].indexOf(5))
})
})
})

Related

Skip a spec file on fail and still report it as failed on result

I am aiming to skip a spec files once an it() inside it fails. And I would still like to see the error reported so I know where to focus on.
I have two test scripts that is inside the same folder first.cy.js and second.cy.js:
describe('test body', () => {
afterEach(() => {
if (cy.state('test').state == 'failed') {
Cypress.runner.stop()
}
})
it('should pass first test', function() {
expect(true).to.eq(true)
})
it('should pass second test', function() {
expect(true).to.eq(true)
})
it('should fail third test and skip this script', function() {
expect(true).to.eq(false)
})
it('should skip fourth test', function() {
expect(true).to.eq(true)
})
})
My problem is on result reporting, it does not report the failing part:
Is there anything I am missing here?
EDIT: I also need to mention that we have retries set on cypress config:
retries: {
runMode: 2
},
Update: Was able to figure out how I will skip the spec file and still record errors with the help of Alapan das:
describe('skipping with retrying and recording', () => {
let errorCount = 0
afterEach(() => {
if (cy.state('test').state == 'failed') {
errorCount += 1
if (errorCount == 3) {
Cypress.runner.stop()
cy.state('test').state = 'failed'
}
}
})
})
The afterEach() is too early to call Cypress.runner.stop(), but it seems to work with test:after:run.
describe('test body', () => {
Cypress.on('test:after:run', (result) => {
if (result.currentRetry === result.retries && result.state === 'failed') {
Cypress.runner.stop()
}
})
it('should pass first test', function() {
expect(true).to.eq(true)
})
it('should pass second test', function() {
expect(true).to.eq(true)
})
it('should fail third test and skip this script', function() {
expect(true).to.eq(false)
})
it('should skip fourth test', function() {
expect(true).to.eq(true)
})
})
Running two identical tests in a single run
Before adding the Cypress.on('test:after:run')
After adding the Cypress.on('test:after:run')
I ran your test exactly in my local with cypress version 10.0.3, I am getting the failure count. This is without test re-tries.
describe('test body', () => {
afterEach(() => {
if (cy.state('test').state == 'failed') {
Cypress.runner.stop()
}
})
it('should pass first test', function () {
expect(true).to.eq(true)
})
it('should pass second test', function () {
expect(true).to.eq(true)
})
it('should fail third test and skip this script', function () {
expect(true).to.eq(false)
})
it('should skip fourth test', function () {
expect(true).to.eq(true)
})
})
Terminal Screenshot:
In case of test retries, one way would be to manually set the test state to failed like this:
afterEach(() => {
if (cy.state('test').state == 'failed') {
Cypress.runner.stop()
cy.state('test').state = 'failed'
}
})

Not able to use alias across tests in Cypress

I am trying to create a framework for API tests using cypress and I am facing an issue accessing the data between tests using an alias. Is there something that I am missing?
custom.js
Cypress.Commands.add('getResource', function (uri) {
cy.request({
url: uri,
method: 'GET'
}).then(function (response) {
return cy.wrap(response);
});
});
test.js
exports.__esModule = true;
context('requests', function () {
it('validate get call response', function () {
let re = cy.getResource('https://reqres.in/api/users?page=2','resp')
re.then(function (response) {
cy.wrap(response.body).as('respbody');
cy.wrap(response.status).as('respstatus');
//cy.log(JSON.stringify(response.body));
});
});
it('Tests test', function () {
cy.wait('#respbody').then((body) => {
console.log(JSON.stringify(body));
});
});
});
cypress version - 8.2.0
By design cypress cleans up aliases after each test. So you can do something like this cypress recipe
Your getResource custom command is taking just one parameter, hence we are passing just one papameter.
exports.__esModule = true;
let responseBody;
let responseStatus;
context('requests', () => {
before(() => {
cy.getResource('https://reqres.in/api/users?page=2')
.then(function(response) {
responseBody = response.body
responseStatus = response.status
})
})
beforeEach(() => {
cy.wrap(responseBody).as('responseBody')
cy.wrap(responseStatus).as('responseStatus')
})
it('Get Response status', function() {
cy.wait('#responseStatus').then((responseStatus) => {
console.log(responseStatus)
})
})
it('Get Response Body', function() {
cy.wait('#responseBody').then((responseBody) => {
console.log(JSON.stringify(responseBody))
})
})
})

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves

I have tried to insert the value in db in my mocha test i am getting this error i tried few of the following ways but nothing work out.
var assert=require('chai').assert;
const user=require('../model/user')
i tried both way
describe('insertDataLasone',()=>{
it('should save the value ',(done)=>{
var User = new user({fname:'test'});
User.save().then(done=>{
done()
}).catch(done=>done())
})
})
describe('User', function() {
describe('#save()', function() {
// this.timeout(5000)
it('should save without error', function(done) {
var User5 = new user({fname:'test'});
User5.save(function(done) {
if (err) done(err);
else setTimeout(done,3000);
});
});
});
});
This error occurs when done() is not called in a test. Make sure you are calling done().
var assert = require('chai').assert;
const User = require('../model/user');
describe('insertDataLasone', () => {
it('should save the value ', done => {
var user = new User({ fname: 'test' });
user.save().then(() => {
done();
})
.catch(done); // mocha done accepts Error instance
});
});
or
var assert = require('chai').assert;
const User = require('../model/user');
describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user5 = new User({ fname: 'test' });
user5.save(function(err) {
if (err) done(err);
else done();
});
});
});
});
Read https://mochajs.org/#asynchronous-code carefully

mocha chaijs : $ is not defined

I'm trying to setting up automated test.
I'm using zombiejs for the browser, mochaJs for the test framework and chaiJs for assertion. I want to use chai-jq for jquery assertion:
var expect = require('chai').expect
var chai = require("chai");
var chaiJq = require('chai-jq');
Browser = require('zombie'),
browser = new Browser();
chai.use(chaiJq);
describe('Test', function(){
before(function(done) {
browser.visit('http://localhost/login.php', done);
});
describe('Connexion au site', function() {
before(function(done) {
browser
.fill('login', 'foo')
.fill('password', 'bar')
.pressButton('Connexion', done);
});
it('should be successful (code 200)', function() {
browser.assert.success(200);
});
});
describe('', function() {
browser.visit('http://localhost/activites/nationales/accueil.php');
it('contain text', function() {
var $elem = $("<div id=\"hi\" foo=\"bar time\" />");
expect($elem)
// Assertion object is `$elem`
.to.have.$attr("id", "hi").and
// Assertion object is still `$elem`
.to.contain.$attr("foo", "bar");
});
});
When I run the test i've got the error ReferenceError: $ is not defined

Mocha multiple test in order

Mocha multiple test in order
I am writting test with mocha like this
describe('application', function(){
describe('First set of test', function(){
var socket;
before(function(done) {
var opts = {
'reconnection delay' : 0,
'reopen delay' : 0,
'forceNew' : true
};
socketio = io.connect(SOCKET_URL, opts);
done();
socketio.on('connect', function() {
console.log('worked...');
});
socketio.on('disconnect', function() {
console.log('disconnected...');
})
});
it('first test should be true', function(done){
expect(variable_one).to.be.false;
done();
});
it('second test should be true', function(done){
client.hget(hash, "status", function(err, result){
expect(variable_two).to.be.true;
done();
})
});
it('thrid test should be true', function(done){
client.hget(hash, "status", function(err, result){
expect(variable_three).to.be.true;
done();
})
});
});
});
What I need is that test should be nested in order, to set the before variables is not enough because the third test depends on the second and the second on the first one. With the done variable are all running in parallel.
Is there a posible way to achieve this?
Thank you

Resources