2017-09-19 27 views
0

我想窥探一个注入到角度组件中的服务方法。如何在角度4茉莉花测试用例中侦测服务方法

我的,我想测试组件的方法是:

validateLogin() { 
    console.log("Before calling validateLogin method,", this.form.value.Username, this.form.value.Password); 
    this.loginService.validateLogin(this.form.value.Username, this.form.value.Password) 
     .then(response => { 
      console.log("Response,", response); 
      if(response.SkipWelcomePage) { 
       this.router.navigateByUrl("/"); 
      } 
      else this.router.navigateByUrl("/welcome"); 
     }) 
     .catch(err => { 
      this.errorMessage = err; 
     }); 
} 

我的测试案例上面的方法是:

it('should validate login', async(() => { 

    const loginService = fixture.debugElement.injector.get(LoginService); 
    spyOn(loginService,'validateLogin').and.returnValue(function (username, password) { 
     return {SkipWelcomePage: false} 
    }); 
    fixture.componentInstance.form.controls['Username'].setValue("test"); 
    fixture.componentInstance.form.controls['Password'].setValue("test"); 
    fixture.detectChanges(); 
    fixture.debugElement.query(By.css('.loginButton')).nativeElement.click(); 
    expect(routerStub.navigate).toHaveBeenCalledWith(['/welcome']); 
    })); 

测试用例是越来越失败,控制台日志:console.log("Response,", response);没有被显示,并且在控制台中也没有错误。

我该如何解决此问题?

回答

0

首先有点清洁的代码。它看起来像你想完全登出登录服务,而不是使用真正的和嘲笑一个功能。

在你所谓的 'loginServiceMock' 初始设置定义的对象:

const loginServiceMock = jasmine.createSpyObj('LoginService', ['validateLogin']); 

然后,在你的供应商名单中,添加:

{provide: LoginService, useValue: loginServiceMock} 

那么问题您遇到。由于您在其结果上调用了'.then()',LoginService应该返回一个Promise对象,而不是一个普通的Typescript对象。你想要做的是这样的:

loginServiceMock.validateLogin.and.returnValue(Promise.resolve({SkipWelcomePage: false}); 
+0

我试过Promise.resolve但忘了把它添加到我的问题,我试过了你提出的方法,但它不工作 - 测试用例越来越失败和控制台日志:console.log(“Response,”,response);没有得到显示 – user1188867

+0

而我得到的错误是XMLHttpRequest无法加载ng:///DynamicTestModule/LoginComponent.ngfactory.js。协议方案仅支持跨源请求:http,data,chrome,chrome-extension,https。 – user1188867