关于返回承诺的功能的spyOn问题

时间:2019-11-21 11:18:00

标签: unit-testing vue.js jasmine spy

这是在编写带有在Vue组件中返回Promise的函数的单元测试时有关spyOn的一个相当普遍的问题。

我编写测试的方式如下:

// Basically this function gets data from a service and sets some data in the component.
function getSomething() {
ServiceX.getSomething().then(response => 
this.x = response.x
)
}

测试:

describe('test', () => {
beforeEach() => {
vm = shallowMount(VueComponent)
spyOn(serviceX, 'getSomething).and.returnValue(promsie.resolve(data));
}

it('should set X', () =>{
vm.getSomething()
expect(vm.X).toBe(X);
})
}

问题是,当我以这种方式进行测试时,尚未设置变量X,但是如果我异步执行“ it”语句并等待getSomething()方法,它将起作用。

我想知道是否还有另一种方法可以做到这一点。

2 个答案:

答案 0 :(得分:0)

由于您的原始方法返回了一个Promise,而您的间谍也返回了一个Promise(甚至是已经解决的),因此您应在评论中使用thenasync await问题。

所以,另一种方式是:

it('should set X', (done) => {
    vm.getSomething().then(() => {
        expect(vm.X).toBe(X);
        done();
    });
})

使用jasmine中的done参数来通知此单元测试是异步的,并且将在调用此回调时完成。

答案 1 :(得分:0)

我知道现在有点太晚了,您可能已经找到了解决方案,但如果您没有找到,我认为我提出的解决方案对您有用。您可以使用fakeAsync 和tick 的组合来测试您的异步功能,下面是我的解决方案。

describe('test', () => {
             ...
             it('should set X', fakeAsync(() =>{
               vm.getSomething();
               tick();
               expect(vm.X).toBe(X);
             }));
             ...
}