单元测试逻辑内部承诺回调

时间:2017-03-10 21:01:23

标签: javascript jasmine aurelia es6-promise

我有一个ES6 / Aurelia应用程序,我正在使用茉莉花进行测试。我试图测试的方法看起来像这样:

update() {
    let vm = this;
    vm.getData()
        .then((response) => {
            vm.processData(response);
        });
}

其中this.getData是一个返回承诺的函数。

我的spec文件看起来像这样:

describe('my service update function', () => {
    it('it will call the other functions', () => { 
        myService = new MyService();
        spyOn(myService, 'getData').and.callFake(function() {
            return new Promise((resolve) => { resolve(); });
        });
        spyOn(myService, 'processData').and.callFake(function() { return; });
        myService.update();

        // this one passes
        expect(myService.getData).toHaveBeenCalled();

        // this one fails
        expect(myService.processData).toHaveBeenCalled();
    });
});

我理解为什么会失败 - 承诺是异步的,并且在达到预期时尚未得到解决。

如何从我的测试中推出解决方案,以便我可以测试回调中的代码?

失败测试的jsfiddle:http://jsfiddle.net/yammerade/2aap5u37/6/

2 个答案:

答案 0 :(得分:6)

我通过返回一个行为类似于promise而不是实际承诺的对象来运行变通方法

describe('my service update function', () => {
    it('it will call the other functions', () => { 
        myService = new MyService();
        spyOn(myService, 'getData').and.returnValue({
            then(callback) {
                callback();
            }
        });
        spyOn(myService, 'processData').and.callFake(function() { return; });
        myService.update();

        // this one passes
        expect(myService.getData).toHaveBeenCalled();

        // this one fails
        expect(myService.processData).toHaveBeenCalled();
    });
});

在这里小提琴:http://jsfiddle.net/yammerade/9rLrzszm/2/

这样做有什么不妥吗?

答案 1 :(得分:0)

it((done) => {
  // call done, when you are done
  spyOn(myService, 'processData').and.callFake(function() {
    expect(myService.processData).toHaveBeenCalled();

    done();
  });
})