javascript - Mocha Failing with "timeout exceeded" - Stack Overflow

I'm new to Mocha and I'm trying to run the tests on this code:"use strict";process.

I'm new to Mocha and I'm trying to run the tests on this code:

"use strict";

process.env.NODE_ENV = 'test';

var assert = require('assert'),
    Browser = require('zombie'),
    xapp = require('../app'),
    app,
    User = require('../models/users').User,
    testMail = '[email protected]',
    testPassword = 'aD1$#!_é',
    server;

before(function(done) {
    xapp(function(sapp) {
        app = sapp;
        server = app.listen(3000, done);
    });
});

after(function(done) {
    app.closeMongo(function() {
        server.close(done);
    });
});

function clearDb(done) {
    User.findOne({email: testMail}, function(err, user) {
        if(err) return done(err);
        if(!user) return done();
        else {
            user.remove(done);
        }
    });
}

describe('User signup', function() {
    this.timeout(3200);

    before(clearDb);

    describe('Homepage Form', function() {
        this.timeout(3200);
        it('should load the trial form', function(done) {
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                var form = browser.query('form[action="/users/signup"]');
                assert.notEqual(form, null, 'Form on homepage exists');
                assert.notEqual(browser.query("input[type=email]", form), null, 'has email input on page');
                done();
            });
        });

        it('should test the trial form', function(done) {
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser
                .fill('email', testMail)
                .pressButton('Sign up', function(err) {
                    if(err) return done(err);
                    assert.equal(browser.location.pathname, '/users/signup', 'Links to signup page');
                    assert.notEqual(browser.text('h1').indexOf('Sign up'), -1, 'Title page contains "Sign up"');
                    var form = browser.query('form#form-signup');
                    assert.notEqual(form, null, 'Form on signup page exists');
                    var emailInput = browser.query('input[type=email]#email', form);
                    assert.notEqual(emailInput, null, 'has email input on signup page');
                    assert.equal(emailInput.value, testMail, 'email input has entered value on homepage');
                    done();
                });
            });
        });
    });

    describe('Signup page form', function() {
        this.timeout(3200);
        it('should load the signup form', function(done) {
            Browser.visit('http://localhost:3000/users/signup', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                var form = browser.query('form[action="/users/signup"]#form-signup');
                assert.notEqual(form, null, 'Form on signup page exists');
                assert.equal(form.method, "post", "Form is POST");
                assert.notEqual(browser.query("input[type=email]#email", form), null, 'has email input on page');
                assert.notEqual(browser.query("input[type=password]#password", form), null, 'has password input on page');
                assert.notEqual(browser.query("input[type=password]#passwordConfirm", form), null, 'has password confirmation input on page');
                done();
            });
        });

        it('should sign up a test user', function(done) {
            Browser.visit('http://localhost:3000/users/signup', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser
                .fill('Email:', testMail)
                .fill('Password:', testPassword)
                .fill('Password confirmation:', testPassword)
                .pressButton('#form-signup button[type=submit]', function(err) {
                    if(err) return done(err);
                    assert.notEqual(browser.query('.alert-success'), null, 'Has success alert');
                    assert.notEqual(browser.text('.alert-success').indexOf('Sign up successful'), -1, 'Found the text "Sign up successful" in alert');
                    done();
                });
            });
        });

        it('shouldn\'t sign up the same email twice', function(done) {
            Browser.visit('http://localhost:3000/users/signup', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser
                .fill('Email:', testMail)
                .fill('Password:', testPassword)
                .fill('Password confirmation:', testPassword)
                .pressButton('#form-signup button[type=submit]', function(err) {
                    if(err) return done(err);
                    assert.equal(browser.location.pathname, '/users/signup', 'Still on the signup page');
                    assert.notEqual(browser.query('.alert-danger'), null, 'Has danger alert');
                    assert.notEqual(browser.text('.alert-danger').indexOf('This email address already exists!'), -1, 'Found the text "This email address already exists!" in alert');
                    done();
                });
            });
        });
    });
});

describe('User login', function() {
    this.timeout(2500);

    after(clearDb);

    describe('Homepage form', function() {
        this.timeout(3200);
        it('should appear when we click login', function(done) {
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                assert.equal(browser.query('form[action="/users/login"]'), null, 'No login form should be visible before we click on login');
                browser.clickLink('Login', function(err) {
                    if(err) return done(err);
                    var form = browser.query('form[action="/users/login"]');
                    assert.notEqual(form, null, 'Login form should be visible after click on login');
                    assert.notEqual(browser.query('input[type=email]#email'), null, 'Has email input');
                    assert.notEqual(browser.query('a', form), null, 'Forgot your password?');
                    assert.notEqual(browser.query('input[type=password]#password'), null, 'Has password input');
                    done();
                });
            });
        });

        it('should not work with wrong credentials', function(done) {
        this.timeout(3200);
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser.clickLink('Login', function(err) {
                    if(err) return done(err);
                    browser
                    .fill('Email:', testMail)
                    .fill('Password:', (testPassword + 'a'))
                    .pressButton('Login', function(err) {
                        if(err) return done(err);
                        assert.equal(browser.location.pathname, '/users/login');
                        assert.notEqual(browser.query('.alert-danger'), null, "Has danger alert");
                        assert.notEqual(browser.text('.alert-danger').indexOf('Invalid email or password.'), -1, 'alert contain error message "Invalid email or password."');
                        done();
                    });
                });
            });
        });
    });

    describe('Login form', function() {
        this.timeout(3200);
        it('should login with valid credentials', function(done) {
            Browser.visit('http://localhost:3000/users/login', function(err, browser) {
                if(err) return done(err);   
                assert.ok(browser.success, "page loaded");
                browser
                .fill('#form-signin input[type=email]', testMail)
                .fill('#form-signin input[type=password]', testPassword)
                .pressButton('Sign in', function(err) {
                    if(err) return done(err);
                    assert.equal(browser.location.pathname, '/');
                    assert.notEqual(browser.query('.alert-success'), null, "Has success alert");
                    assert.equal(browser.text('.alert-success'), '×Close You are now logged in.');
                    assert.notEqual(browser.link('Dashboard'), null, 'Has dashboard link');
                    assert.notEqual(browser.link('Log out'), null, 'Has log out link');
                    done();
                });
            });
        });
    });
});

This is the mand I'm using:

$ mocha -b -R spec -s 1000

And it's failing with this message:

  1) "before all" hook

  0 passing (2s)
  1 failing

  1)  "before all" hook:
     Error: timeout of 2000ms exceeded
      at null.<anonymous> (/usr/local/lib/node_modules/mocha/lib/runnable.js:159:19)
      at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

Could you please help me figure out why this is caused?

I know that if I change the timeout for the test runner:

$ mocha -b -R spec -s 1000 -t 3000

The tests work. But I want to know the actual cause of this error.

Thank you!

I'm new to Mocha and I'm trying to run the tests on this code:

"use strict";

process.env.NODE_ENV = 'test';

var assert = require('assert'),
    Browser = require('zombie'),
    xapp = require('../app'),
    app,
    User = require('../models/users').User,
    testMail = '[email protected]',
    testPassword = 'aD1$#!_é',
    server;

before(function(done) {
    xapp(function(sapp) {
        app = sapp;
        server = app.listen(3000, done);
    });
});

after(function(done) {
    app.closeMongo(function() {
        server.close(done);
    });
});

function clearDb(done) {
    User.findOne({email: testMail}, function(err, user) {
        if(err) return done(err);
        if(!user) return done();
        else {
            user.remove(done);
        }
    });
}

describe('User signup', function() {
    this.timeout(3200);

    before(clearDb);

    describe('Homepage Form', function() {
        this.timeout(3200);
        it('should load the trial form', function(done) {
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                var form = browser.query('form[action="/users/signup"]');
                assert.notEqual(form, null, 'Form on homepage exists');
                assert.notEqual(browser.query("input[type=email]", form), null, 'has email input on page');
                done();
            });
        });

        it('should test the trial form', function(done) {
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser
                .fill('email', testMail)
                .pressButton('Sign up', function(err) {
                    if(err) return done(err);
                    assert.equal(browser.location.pathname, '/users/signup', 'Links to signup page');
                    assert.notEqual(browser.text('h1').indexOf('Sign up'), -1, 'Title page contains "Sign up"');
                    var form = browser.query('form#form-signup');
                    assert.notEqual(form, null, 'Form on signup page exists');
                    var emailInput = browser.query('input[type=email]#email', form);
                    assert.notEqual(emailInput, null, 'has email input on signup page');
                    assert.equal(emailInput.value, testMail, 'email input has entered value on homepage');
                    done();
                });
            });
        });
    });

    describe('Signup page form', function() {
        this.timeout(3200);
        it('should load the signup form', function(done) {
            Browser.visit('http://localhost:3000/users/signup', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                var form = browser.query('form[action="/users/signup"]#form-signup');
                assert.notEqual(form, null, 'Form on signup page exists');
                assert.equal(form.method, "post", "Form is POST");
                assert.notEqual(browser.query("input[type=email]#email", form), null, 'has email input on page');
                assert.notEqual(browser.query("input[type=password]#password", form), null, 'has password input on page');
                assert.notEqual(browser.query("input[type=password]#passwordConfirm", form), null, 'has password confirmation input on page');
                done();
            });
        });

        it('should sign up a test user', function(done) {
            Browser.visit('http://localhost:3000/users/signup', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser
                .fill('Email:', testMail)
                .fill('Password:', testPassword)
                .fill('Password confirmation:', testPassword)
                .pressButton('#form-signup button[type=submit]', function(err) {
                    if(err) return done(err);
                    assert.notEqual(browser.query('.alert-success'), null, 'Has success alert');
                    assert.notEqual(browser.text('.alert-success').indexOf('Sign up successful'), -1, 'Found the text "Sign up successful" in alert');
                    done();
                });
            });
        });

        it('shouldn\'t sign up the same email twice', function(done) {
            Browser.visit('http://localhost:3000/users/signup', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser
                .fill('Email:', testMail)
                .fill('Password:', testPassword)
                .fill('Password confirmation:', testPassword)
                .pressButton('#form-signup button[type=submit]', function(err) {
                    if(err) return done(err);
                    assert.equal(browser.location.pathname, '/users/signup', 'Still on the signup page');
                    assert.notEqual(browser.query('.alert-danger'), null, 'Has danger alert');
                    assert.notEqual(browser.text('.alert-danger').indexOf('This email address already exists!'), -1, 'Found the text "This email address already exists!" in alert');
                    done();
                });
            });
        });
    });
});

describe('User login', function() {
    this.timeout(2500);

    after(clearDb);

    describe('Homepage form', function() {
        this.timeout(3200);
        it('should appear when we click login', function(done) {
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                assert.equal(browser.query('form[action="/users/login"]'), null, 'No login form should be visible before we click on login');
                browser.clickLink('Login', function(err) {
                    if(err) return done(err);
                    var form = browser.query('form[action="/users/login"]');
                    assert.notEqual(form, null, 'Login form should be visible after click on login');
                    assert.notEqual(browser.query('input[type=email]#email'), null, 'Has email input');
                    assert.notEqual(browser.query('a', form), null, 'Forgot your password?');
                    assert.notEqual(browser.query('input[type=password]#password'), null, 'Has password input');
                    done();
                });
            });
        });

        it('should not work with wrong credentials', function(done) {
        this.timeout(3200);
            Browser.visit('http://localhost:3000/', function(err, browser) {
                if(err) return done(err);
                assert.ok(browser.success, "page loaded");
                browser.clickLink('Login', function(err) {
                    if(err) return done(err);
                    browser
                    .fill('Email:', testMail)
                    .fill('Password:', (testPassword + 'a'))
                    .pressButton('Login', function(err) {
                        if(err) return done(err);
                        assert.equal(browser.location.pathname, '/users/login');
                        assert.notEqual(browser.query('.alert-danger'), null, "Has danger alert");
                        assert.notEqual(browser.text('.alert-danger').indexOf('Invalid email or password.'), -1, 'alert contain error message "Invalid email or password."');
                        done();
                    });
                });
            });
        });
    });

    describe('Login form', function() {
        this.timeout(3200);
        it('should login with valid credentials', function(done) {
            Browser.visit('http://localhost:3000/users/login', function(err, browser) {
                if(err) return done(err);   
                assert.ok(browser.success, "page loaded");
                browser
                .fill('#form-signin input[type=email]', testMail)
                .fill('#form-signin input[type=password]', testPassword)
                .pressButton('Sign in', function(err) {
                    if(err) return done(err);
                    assert.equal(browser.location.pathname, '/');
                    assert.notEqual(browser.query('.alert-success'), null, "Has success alert");
                    assert.equal(browser.text('.alert-success'), '×Close You are now logged in.');
                    assert.notEqual(browser.link('Dashboard'), null, 'Has dashboard link');
                    assert.notEqual(browser.link('Log out'), null, 'Has log out link');
                    done();
                });
            });
        });
    });
});

This is the mand I'm using:

$ mocha -b -R spec -s 1000

And it's failing with this message:

  1) "before all" hook

  0 passing (2s)
  1 failing

  1)  "before all" hook:
     Error: timeout of 2000ms exceeded
      at null.<anonymous> (/usr/local/lib/node_modules/mocha/lib/runnable.js:159:19)
      at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

Could you please help me figure out why this is caused?

I know that if I change the timeout for the test runner:

$ mocha -b -R spec -s 1000 -t 3000

The tests work. But I want to know the actual cause of this error.

Thank you!

Share Improve this question asked Jan 29, 2015 at 10:14 Alain Jaet ForteAlain Jaet Forte 4,6856 gold badges32 silver badges43 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 5

You get the error you are getting because your top level before hook takes more than the default 2000ms timeout delay to run. In case you did not know: before means "execute this before all tests in this suite" and this is why the error message talks of a "before all" hook.

It works when you do $ mocha -b -R spec -s 1000 -t 3000 because you've increased the timeout to 3000ms. The code in your before hook takes between 2 and 3 seconds to run. You could make this setting permanent by putting it inside test/mocha.opts.

Use BeforeEach instead of Before

The problem is, server.listen is blocking so the done statement in the callback doesn't execute until all of the tests are pleted and server.close is called.

A simple (and IMHO) cleaner solution to prevent from violating the default time limit is to start/stop the server for each test.

Change:

before(function(done) {
    xapp(function(sapp) {
        app = sapp;
        server = app.listen(3000, done);
    });
});

after(function(done) {
    app.closeMongo(function() {
        server.close(done);
    });
});

To:

beforeEach(function(done) {
    xapp(function(sapp) {
        app = sapp;
        server = app.listen(3000, done);
    });
});

afterEach(function(done) {
    app.closeMongo(function() {
        server.close(done);
    });
});

No test should run longer than 2000ms unless something goes wrong.

Another, potentially better solution, is to use a testing framework specifically designed to test API calls.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745183381a4615522.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信