2017-03-27 59 views
4

我正在测试一个简单的服务。该服务使用来自其他服务的2个值。Angular2测试:更改服务的注入值

基本上,我想测试的那些2个值:isLogged =假isLogged =真

是否可以更改注入服务的值,还是需要执行其他操作? (我不知道,所以如果你能在路上引导我,我会很感激)。

这里是我的测试代码:

编辑我已经找到了解决我的问题。您需要将提供程序注入注入参数,并且您可以根据需要更改其属性。

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']); 
    })); 
    }); 
+0

是的,这是可能的。这也可能取决于AuthService是什么以及如何使用它。 – estus

+0

AuthService表示如果'isLogged'为false,则重定向到''login'',如果是true,则返回给函数** checkLoginState的参数** – trichetriche

回答

0

您声明的解决方案是一种方法。如果你所要完成的任务是改变在测试的数值,更简捷的办法就是改变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(或不)的理由。