这是在编写带有在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()方法,它将起作用。
我想知道是否还有另一种方法可以做到这一点。
答案 0 :(得分:0)
由于您的原始方法返回了一个Promise,而您的间谍也返回了一个Promise(甚至是已经解决的),因此您应在评论中使用then
或async
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);
}));
...
}