强制失败茉莉花测试

Ben*_*Ben 53 javascript jasmine

如果我在一个永远不会达到的测试中有代码(例如,failpromise序列的子句),我怎么能强制失败测试?

我使用类似的东西,expect(true).toBe(false);但这不是很好.

另一种方法是等待测试超时,我想避免(因为它很慢).

Mic*_*nov 71

Jasmine提供了一个全局方法fail(),可以在spec块中使用it(),也允许使用自定义错误消息:

it('should finish successfully', function (done) {
  MyService.getNumber()
  .success(function (number) {
    expect(number).toBe(2);
    done();
  })
  .fail(function (err) {
    fail('Unwanted code branch');
  });
});
Run Code Online (Sandbox Code Playgroud)

这是内置的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');
  });
});
Run Code Online (Sandbox Code Playgroud)

但是你应该小心,如果你想从Promise成功处理程序中抛出一个错误then(),因为错误将被吞并在那里并且永远不会出现.此外,您应该知道应用程序中可能存在的错误处理程序,这可能会在您的应用程序中捕获此错误,因此无法通过测试失败.

  • 还有`done.fail('message')`. (14认同)
  • 对于那些坚持使用旧版Jasmine的人来说,'fail'方法在1.3中不可用,但可以通过`throw new Error(message)`有效地填充.效果可能取决于你的测试运行器 - 也考虑像'expect('[失败的原因]').toBeNull()`. (4认同)

Joh*_*kel 6

感谢TrueWill让我注意到这个解决方案。如果您正在测试返回承诺的函数,那么您应该doneit(). 而不是打电话,fail()你应该打电话done.fail()。请参阅Jasmine 文档

这是一个例子

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
    });
});
Run Code Online (Sandbox Code Playgroud)