繁体   English   中英

Angular 单元测试用例 promise

[英]Angular Unit test cases for promise

我正在尝试为 Promise 内的服务编写一个单元测试用例,我可以执行 promise 调用,但无法执行内部服务,此外在代码覆盖率报告中,它显示代码未涵盖 ZB321DE3BDC299EC807E9F795D7 行。 请告诉我我在哪里做错了。

下面的文件是我们的 usercomponent.component.ts。

             import {Component, OnInit} from '@angular/core';
             import {UserService} from "../services/user.service";

             @Component({
                 selector: 'user',
                 templateUrl: './user.component.html',
                styleUrls: ['./user.component.css']
              })

        export class UserComponent implements OnInit {

          constructor(private userService: UserService) {}
          
          getToken(){

             return new Promise(function(resolve,reject){
                if(this.token){
                    resolve(this.token);
                 }else{
                          this.userService.getToken().subscribe((data)=>{
                            resolve(data.token); 
                         },
                        error: (error) => {
                             reject(error)
                         },
                         )
                     }
              })

             }
           }

下面的文件是我们的 user.component.spec.ts 文件

          import {UserComponent} from './user.component';
          import {async, ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing';
          import {of} from 'rxjs';
          import {UserService} from "../services/user.service";
          
          class MockUserClass{
               getToken(){ return new Observable()}
           }

          describe('UserComponent', () => {
              const fixture;
              const component;

              beforeEach(
                  wairForAsync(()=>{
                      Test.Bed.configureTestingModule({
                          declarations: [UserComponent],
                          providers: [{{provide:UserService,useClass:MockUserClass}]
                       }).compileComponents();
                  });
              )

              beforeEach(()=>{
                 fixture = TestBed.createComponent(UserComponent);
                 component = fixture.componentInstance;
                 fixture.detectChanges();
              })

              it(`should call getToken method`,fakeAsync(()=>{
              const spy =  spyOn(component,'getToken').and.returnValue(Promise.resolve('token'));
              const spyOnService = sppyOn(component.userService, 'getToken').and.returnValue(of(mockData))
              component.getToken();
              tick();
              expect(spy ).toHaveBeenCalled();
              expect(spyOnService).toHaveBeenCalled();
              }));
          });

你在做间谍:
const spy = spyOn(component,'getToken').and.returnValue(Promise.resolve('token')); .
然后,当您调用此方法时,它将返回您的假 promise。 所以它不会调用你的服务,它只会返回你模拟的 promise。 所以这段代码没有任何意义:

component.getToken();
expect(spy).toHaveBeenCalled();

expect()语句将始终为真,因为您手动调用它。 首先尝试删除此间谍:

          // const spy =  spyOn(component,'getToken').and.returnValue(Promise.resolve('token'));
          const spyOnService = sppyOn(component.userService, 'getToken').and.returnValue(of(mockData))
          component.getToken();
          tick();
          // expect(spy ).toHaveBeenCalled();
          expect(spyOnService).toHaveBeenCalled();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM