我对单元测试还很陌生,所以请耐心等待
I'm quite new to Unit testing so bear with me
我正在尝试对在Angular应用程序中使用Amplify登录用户的服务进行单元测试.
I'm trying to unit test a service that is used to log the user with Amplify in an Angular application.
现在在我正在运行的规格文件中:
Right now in the spec file I'm doing:
beforeEach(async () => { TestBed.configureTestingModule({ imports: [ HttpClientTestingModule, ], providers: [ MyService, Amplify ] } myService = TestBed.get(MyService) amplify = TestBed.get(Amplify) }) it('should login', async () => { const objToBeReturned = { signInUserSession: { idToken: { jwtToken: 'tokenValue' } } } spyOn(Amplify.Auth, 'signIn').and.returnValue(objToBeReturned) await myService.login('username', 'password') })在 MyService 中:
public async login(username: string, password: string) { const authUser = await Amplify.Auth.signIn(username.toLowerCase(), password) if (authUser.signInUserSession != null) { const idToken = authUser.signInUserSession.idToken.jwtToken return this.patientLogin(idToken) } } private async patientLogin(idToken?: string): Promise<boolean> { await this.sendRequest<LoginResponse>(url, data).pipe( tap(response => { if (!isLoginResponse(response)) { throw throwErr({ code: 'Generic' }) } this.token = response.token }) ).toPromise() return true }这给了我错误异步功能未在5000毫秒内完成
我很确定这取决于我模拟Amplify的方式
I'm pretty sure it depends on the way I'm mocking Amplify
我该如何正确模拟它?
推荐答案尝试:
it('should login', async (done) => { spyOn(myService, 'patientLogin'); // assuming it is a public function const objToBeReturned = { signInUserSession: { idToken: { jwtToken: 'tokenValue' } } } // Promise.resolve is optional but since it is returning a promise and we are awaiting it, I think we should do it here as well. spyOn(Amplify.Auth, 'signIn').and.returnValue(Promise.resolve(objToBeReturned)); console.log('calling login'); await myService.login('username', 'password'); // fixture.whenStable() can be optional as well, but I think it will be good to wait for all promises to finish console.log('login resolved'); await fixture.whenStable(); expect(myService.patientLogin).toHaveBeenCalledWith('tokenValue'); // call the done function to tell the test you are done, I think this is what you were missing done(); })=======编辑=============
====== Edit ===============
您必须找出测试卡在哪里,我认为this.patientLogin(idToken)是异步的并且卡在那里.查看console.logs,确保您看到login resolved.基于这种预感,我监视了patientLogin,并断言它已被调用.
You have to find out where the test is getting stuck, I am thinking this.patientLogin(idToken) is asynchronous and is getting stuck there. Look at the console.logs, make sure you see login resolved. Based on this hunch, I have spied on patientLogin, and just assert it was called.
更多推荐
如何在Jasmine中正确模拟Amplify进行单元测试?
发布评论