【问题标题】:How to spy service method in angular 4 jasmine test cases如何在 Angular 4 jasmine 测试用例中监视服务方法
【发布时间】:2017-09-19 05:45:13
【问题描述】:

我想监视一个注入到角度组件中的服务方法。

我要测试的组件中的方法是:

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); 没有显示,控制台也没有错误。

我该如何解决这个问题?

【问题讨论】:

  • 如果您显示您遇到的错误 xD 将会很有用

标签: angular jasmine karma-jasmine


【解决方案1】:

首先是一些更简洁的代码。看起来您想完全删除登录服务,而不是使用真实的服务并模拟一个函数。

在您的初始设置中定义一个名为“loginServiceMock”的对象:

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

然后,在您的提供者列表中,添加:

{provide: LoginService, useValue: loginServiceMock}

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

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

【讨论】:

  • 我已经尝试过 Promise.resolve 但忘记将其添加到我的问题中,我尝试了您建议的方法但它不起作用 - 测试用例失败并且控制台日志:console.log (“回应”,回应);没有显示出来
  • 我得到的错误是 XMLHttpRequest cannot load ng:///DynamicTestModule/LoginComponent.ngfactory.js。跨源请求仅支持协议方案:http、data、chrome、chrome-extension、https。
猜你喜欢
  • 2018-05-10
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2018-03-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多