我正在尝试使用Mocha 2.4.5和Should.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();
答案 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不会将异步断言标记为缓慢。