在异步超时

时间:2017-12-21 19:33:21

标签: javascript jasmine jasmine2.0

运行Jasmine 2.8。

我有一个测试用例,其中失败案例是在不应该的情况下触发的事件处理程序。请注意,提供事件的代码库是专有的,内部开发的系统的一部分,因此这些不是DOM事件,我没有利用任何流行的JS框架:

    it('should trigger the event handler in state 0', function (done) {
        function specCb(ev) {
            expect(ev).toBeDefined();
            expect(ev.data).toBe('some value');
            done();
        }
        thing.state = 0;
        simulateEventTrigger(thing, specCb);
    });

    it('should not trigger the event handler in state 1', function (done) {
        function specCb(ev) {
            done.fail('this should not be called in state 1');
        }
        thing.state = 1;
        simulateEventTrigger(thing, specCb);
    });

第二个规范将始终失败,因为要么调用回调,要么明确地使规范失败,要么等待done()的规范超时,从而使它失败。如果超时,如何让Jasmine 传递规范?

2 个答案:

答案 0 :(得分:1)

在Jasmine中查看spies。间谍允许你“窥探”"一个函数并断言它是否已被调用以及使用哪些参数。或者,在您的情况下,是否没有被调用。一个例子可能看起来像......

describe("A spy", function() {
  var evHandlers;

  beforeEach(function() {
    evHandlers = {
       callback: function (e) {}
    }

    spyOn(evHandlers, 'callback');
  });

  it('should not trigger the event handler in state 1', function (done) {
      thing.state = 1;
      simulateEventTrigger(thing, evHandlers.callback);
      expect(evHandlers.callback).not.toHaveBeenCalled();
  });
});

答案 1 :(得分:0)

实际上it函数接受回调,所以你可以这样做:

const TEST_TIMEOUT = 1000;
const CONSIDER_PASSED_AFTER = 500;

describe('a test that is being considered passing in case of a timeout', () => {
    it('should succeed in after a specified time interval', done => {
        setTimeout(() => {
            done();
        }, CONSIDER_PASSED_AFTER);
    }, TEST_TIMEOUT);
});