【问题标题】:Angular2 testing: change the injected value of a serviceAngular2 测试:更改服务的注入值
【发布时间】:2017-03-27 12:10:26
【问题描述】:

我正在测试一个简单的服务。该服务使用来自另一个服务的 2 个值。

基本上,我想测试这两个值:isLogged = falseisLogged = true

是否可以只更改注入服务的值,还是我需要做其他事情? (我不知道,所以如果你能带我上路,我会很感激的)。

这是我的测试代码:

编辑我找到了解决问题的方法。您需要将提供程序注入到 inject 参数中,之后您可以根据需要更改其属性。

  import { TestBed, async, inject } from '@angular/core/testing';
  import { AuthGuardService } from './authguard.service';
  import { Router } from '@angular/router';

  import { AuthService } from './auth.service';

  describe('AuthguardService', () => {

    let calledUrl = '/logged/main/last';

    let authServiceStub = {
      isLogged: false,
      redirectUrl: calledUrl
    };

    class RouterStub {
      navigate(url: string) { return url; }
    };

    beforeEach(() => {
      TestBed.configureTestingModule({
        providers: [
          AuthGuardService,
          { provide: AuthService, useValue: authServiceStub },
          { provide: Router, useClass: RouterStub },
        ]
      });
    });

    it('should ...', inject([AuthGuardService, Router], (service: AuthGuardService, router: Router) => {
      let spy = spyOn(router, 'navigate');

      service.checkLoginState(calledUrl);
      expect(spy).toHaveBeenCalledWith(['/login']);
    }));
  });

【问题讨论】:

  • AuthService 表示如果isLogged 为假,则重定向到'login',如果为真,则重定向到函数checkLoginState 的参数

标签: angular angular2-testing


【解决方案1】:

您所说的解决方案是一种方法。如果你想要完成的只是更改测试中的值,更简洁的方法是直接更改 authServiceStub 中的值:

// inside tests:
authServiceStub.isLogged = false;
...
authServiceStub.isLogged = true;

^ 简单但不是很封装。

或者参数化它:

let isLogged: false;
let authServiceStub = {
      isLogged: isLogged,
      redirectUrl: calledUrl
    };
...
// inside tests:
isLogged = false;
...
isLogged = true;

^ 简洁但仍未封装。

或者添加一个setter:

let authServiceStub = {
      isLogged: false,
      setLogged: function(logged) { this.isLogged = logged; },
      redirectUrl: calledUrl
    };
...
// inside tests:
setLogged(false);
...
setLogged(true);

^ 更加封装。可以与您的注入方法结合使用。

或者如果 isLogged 被重新实现为一个函数,你可以使用 spyOn:

// inside tests:
spyOn(authServiceStub, "isLogged").and.returnValue(false);
...
spyOn(authServiceStub, "isLogged").and.returnValue(true);

^ 更多的黑盒和可能更灵活/面向未来,特别是如果与您的注入解决方案结合使用(因为您可以大幅更改存根或模拟,但仍然可以获得您想要的行为)。这是更多的前期工作,所以可能不值得。但是以这种黑盒方式考虑 AuthService 可能会给你一个重构 isLogged 到一个函数(或不重构)的理由。

【讨论】:

  • 我是唯一一个不能让它工作的人吗?我更改了提供的存根的值,但测试使用旧值运行。
  • 对我也不起作用。一旦服务在提供者中,看起来引用就会丢失。
猜你喜欢
  • 2016-10-31
  • 2017-09-17
  • 1970-01-01
  • 2018-06-04
  • 2023-03-29
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多