如果我在永远不会达到的测试中有代码(例如,承诺序列的fail
子句),我该如何强制失败测试?
我使用expect(true).toBe(false);
之类的东西,但这并不漂亮。
备选方案是等待测试超时,我想避免(因为它很慢)。
答案 0 :(得分:65)
Jasmine提供了一个全局方法fail()
,可以在规范块it()
中使用,也允许使用自定义错误消息:
it('should finish successfully', function (done) {
MyService.getNumber()
.success(function (number) {
expect(number).toBe(2);
done();
})
.fail(function (err) {
fail('Unwanted code branch');
});
});
这是内置的Jasmine功能,与我在下面提到的“错误”方法相比,它在任何地方都可以正常工作。
更新前:
您可以从该代码分支引发错误,它会立即失败,您将能够提供自定义错误消息:
it('should finish successfully', function (done) {
MyService.getNumber()
.success(function (number) {
expect(number).toBe(2);
done();
})
.fail(function (err) {
throw new Error('Unwanted code branch');
});
});
但是如果你想从Promise成功处理程序then()
中抛出一个错误,你应该小心,因为错误将被吞并在那里,永远不会出现。此外,您应该了解应用中可能存在的错误处理程序,这可能会在您的应用程序中发现此错误,因此无法通过测试。
答案 1 :(得分:1)
感谢 TrueWill 使我关注此解决方案。如果要测试返回承诺的函数,则应使用done
中的it()
。而且,您应该致电fail()
而不是致电done.fail()
。参见Jasmine documentation。
这是一个例子
describe('initialize', () => {
// Initialize my component using a MOCK axios
let axios = jasmine.createSpyObj<any>('axios', ['get', 'post', 'put', 'delete']);
let mycomponent = new MyComponent(axios);
it('should load the data', done => {
axios.get.and.returnValues(Promise.resolve({ data: dummyList }));
mycomponent.initialize().then(() => {
expect(mycomponent.dataList.length).toEqual(4);
done();
}, done.fail); // <=== NOTICE
});
});