【发布时间】:2022-02-08 04:07:31
【问题描述】:
如果我在测试中包含永远无法到达的代码(例如,promise 序列的 fail 子句),我该如何强制测试失败?
我使用expect(true).toBe(false); 之类的东西,但这并不漂亮。
另一种方法是等待测试超时,我想避免这种情况(因为它很慢)。
【问题讨论】:
标签: javascript jasmine
如果我在测试中包含永远无法到达的代码(例如,promise 序列的 fail 子句),我该如何强制测试失败?
我使用expect(true).toBe(false); 之类的东西,但这并不漂亮。
另一种方法是等待测试超时,我想避免这种情况(因为它很慢)。
【问题讨论】:
标签: javascript jasmine
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() 抛出一个错误,因为错误将被吞没在那里并且永远不会出现。此外,您应该注意应用程序中可能存在的错误处理程序,它们可能会在您的应用程序中捕获此错误,因此它不会导致测试失败。
【讨论】:
throw new Error(message) 有效地填充。有效性可能取决于您的测试运行器 - 也可以考虑expect('[reason for failure]').toBeNull()。
感谢 TrueWill 让我关注此解决方案。如果您正在测试返回承诺的函数,那么您应该在it() 中使用done。而不是打电话给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
});
});
【讨论】:
fail 和 done.fail 都不是函数(可能意味着未定义)的错误。我不得不使用不优雅的expect(false).toBeTruthy() 作为解决方法。
import 'jasmine'; 放在我的测试用例文件的顶部。听起来您缺少导入、需要或类似的东西。