强制失败茉莉花测试

时间:2015-08-27 14:18:18

标签: javascript jasmine

如果我在永远不会达到的测试中有代码(例如,承诺序列的fail子句),我该如何强制失败测试?

我使用expect(true).toBe(false);之类的东西,但这并不漂亮。

备选方案是等待测试超时,我想避免(因为它很慢)。

2 个答案:

答案 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
    });
});