如何修复异步断言中的mocha错误格式

时间:2016-04-11 20:05:17

标签: asynchronous mocha should.js

我正在尝试使用Mocha 2.4.5Should.js 8.3.0在浏览器中设置测试。

失败 断言应显示有用的测试失败原因。
但是,当在jQuery Ajax回调的上下文中进行相同的断言时,我得到 Uncaught Assertion Error

采用以下示例:

mocha.setup('bdd');
var url = 'http://localhost/api/v2/People';
describe('ajax', () => {
    var that1 = this;
    it('Passing async assertion', (done) => {
        $.ajax({ url: url }).done(data => {
            should(1).be.eql(1);
            done();
        });
    });
    it('Failing async assertion', (done) => {
        var that2 = this;
        $.ajax({ url: url }).done(data => {
            should(0).be.eql(1);
            done();
        });
    });
    it('Failing sync assertion', (done) => {
        should(0).be.eql(1);
        done();
    });
});
mocha.run();

'传递异步断言'传递并在测试运行器输出中看起来很漂亮。

'失败的同步断言'失败,我得到了一个有用的堆栈跟踪

  

失败同步断言‣
  AssertionError:预期0等于1
  在Assertion.fail(http://path/to/should.js:220:17
  在Assertion.Object.defineProperty.value(http://path/to/should.js:292:19
  在上下文。 (tests.js:337:26)

然而,'失败的异步断言'失败(这很好),但堆栈跟踪是无用的。

  

失败异步断言‣
  错误:未捕获的断言错误(http://path/to/should.js:200

我已经将ajax上下文设置为 that1 that2 ,但它没有任何区别。

是否有其他方法来格式化测试用例,以便异步断言有效?

修改

我使用简单的超时来模拟异步性

mocha.setup('bdd');
describe('ajax', () => {
    var that1 = this;
    it('Failing async assertion', (done) => {
        setTimeout(() => {
            should(0).be.eql(1);
            done();
        }, 100);
    }).async = true;
    it('Failing sync assertion', (done) => {
        should(0).be.eql(1);
        done();
    });
});
mocha.run();

1 个答案:

答案 0 :(得分:0)

Mocha的文档建议像我在我的问题中那样格式化异步测试,但我认为这些文档是用Node.js测试运行器编写的。

在浏览器中,似乎有必要在'before'函数中执行异步代码,然后根据存储的值进行同步断言。

例如:

mocha.setup('bdd');
describe('ajax', () => {
    var value = 0;
    before((done) => {
        //Do the asynchronous bit
        setTimeout(() => {
            //store the value for later comparison
            value = 1;
            done();
        }, 100);
    });
    //These wont be called until after done() is called above.
    //So value will be 1
    it('Failing assertion', () => {
        should(value).be.eql(0);
    });
    it('Passing assertion', () => {
        should(value).be.eql(1);
    });
});
mocha.run();

此处的额外好处是,由于外部因素(如网络延迟),Mocha不会将异步断言标记为缓慢。