我通常使用fakeAsync来测试返回可观察量的订阅。但在这种罕见的场合,我需要做同样的事情,但是要做出承诺。
这是我的尝试:
Textview
这是我的实际代码:
//Service Stub:
const testService = {
testMethod:
jasmine.createSpy('testMethod').and.callFake(() => new Promise(() => 'test'))
};
it('test example',() => {
// Arrange
const response = 'test';
component.selected = undefined;
// Act
component['myMethod']();
//Assert
expect(component.selected).toEqual(response);
});
基本上,需要知道如何等待" this.testService.testMethod"返回并设置选中。
目前,它还没有等待回归的承诺。
注意:我已更新当前的尝试。但是在期待中仍然未定义。
答案 0 :(得分:0)
实际上我不确定我是否理解您的问题正确,但是使用async和await可能是一种解决方案!请参见下面的示例。
要测试的课程
import { Router } from '@angular/router';
...
@Injectable({
providedIn: 'root'
})
export class NavigationService {
constructor(public router: Router) {
}
// Function to test. Note, that the routers navigate function returns a promise.
navigateToAdminsLandingPage(): void {
this.router.navigate(['admin']).then();
}
测试返回模拟承诺的函数
import ...
describe('NavigationService', () => {
let testObj: NavigationService;
// Test setup.
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
]
});
testObj = TestBed.get(NavigationHelperService);
});
// Testing a promise with async and await.
it('should navigate to admin landing page', async () => {
const spy = spyOn(testObj.router, 'navigate').and.returnValue(Promise.resolve(true));
await testObj.navigateToAdminsLandingPage();
expect(spy).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledWith(['admin']);
});
});
答案 1 :(得分:-1)
停止使用异步调用,只需创建承诺的模拟。
const ret = {}; // Give it the value you want.
spyOn(component.testService, 'testMethod').and.callFake(() => {
return Promise.resolve(ret); // Give it the value you want.
});
// ...
// Do your thing ...
// ...
// Call the method
component.myMethod();
// Now, you can expect
expect(component.myMethod).toHaveBeenCalled();
expect(component.selected).toEqual(ret);
答案 2 :(得分:-2)
您可以尝试拨打tick()
通话后