加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular2测试:更改服务的注入值

发布时间:2020-12-17 17:00:26 所属栏目:安全 来源:网络整理
导读:我正在测试一项简单的服务.该服务使用来自其他服务的2个值. 基本上,我想测试这两个值:isLogged = false和isLogged = true. 是否可以仅更改注入服务的值,还是需要执行其他操作? (我不知道,所以如果你能带路我,我会很感激). 这是我的测试代码: 编辑我找到了
我正在测试一项简单的服务.该服务使用来自其他服务的2个值.

基本上,我想测试这两个值:isLogged = false和isLogged = 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']);
    }));
  });

解决方法

您声明的解决方案是单向的.如果要完成的只是更改测试中的值,更简洁的方法就是直接更改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重构为函数(或不).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读