测试服务时如何模拟服务依赖?
how to mock service dependency when testing service?
我必须测试使用其他服务的服务。
我创建了伪造的服务。
我将其配置为 return 假值,将其他虚假服务配置为 return 真值。
我如何进行使用虚假服务的测试?
我需要 1 个测试来使用第一个模拟和第二个测试来使用第二个模拟。
但是在提供程序数组中我只能使用 1 class
我如何在第二个测试中使用 FakeVuiAuthServiceFalse 作为依赖项?
/* tslint:disable:no-unused-variable */
import { TestBed, async, inject } from '@angular/core/testing';
import { AuthGuardService } from './auth-guard.service';
import { VuiAuthService } from './vui-auth.service';
import { AUTH_REDIRECT } from './injection-tokens/injections-tokens';
import { RouterTestingModule } from '@angular/router/testing';
export class FakeVuiAuthServiceFalse {
isLoggedIn(): boolean {
return false;
}
}
export class FakeVuiAuthServiceReturnTrue {
isLoggedIn() {
return true;
}
}
describe('AuthGuard', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule],
providers: [AuthGuardService,
{
provide: AUTH_REDIRECT,
useValue: {
redirectTo: ''
}
},
{ provide: VuiAuthService, useClass: FakeVuiAuthServiceReturnTrue }
],
});
});
it('when user logged in should return true',
inject([AuthGuardService, VuiAuthService],
(service: AuthGuardService, dep: VuiAuthService) => {
spyOn(dep, 'isLoggedIn');
expect(service.canActivate).toBeTruthy();
}));
it('when user not logged in should return false',
inject([AuthGuardService, VuiAuthService],
(service: AuthGuardService, dep: VuiAuthService) => {
spyOn(dep, 'isLoggedIn');
expect(service.canActivate).toBeFalsy();
}));
});
你试试这样使用spyOn。
在单独的测试用例和 return 不同的值下指定 spyOn。
spyOn(AuthGuardService.prototype, 'isLoggedIn').and.callFake(() => { return true });
我必须测试使用其他服务的服务。 我创建了伪造的服务。 我将其配置为 return 假值,将其他虚假服务配置为 return 真值。 我如何进行使用虚假服务的测试? 我需要 1 个测试来使用第一个模拟和第二个测试来使用第二个模拟。 但是在提供程序数组中我只能使用 1 class 我如何在第二个测试中使用 FakeVuiAuthServiceFalse 作为依赖项?
/* tslint:disable:no-unused-variable */
import { TestBed, async, inject } from '@angular/core/testing';
import { AuthGuardService } from './auth-guard.service';
import { VuiAuthService } from './vui-auth.service';
import { AUTH_REDIRECT } from './injection-tokens/injections-tokens';
import { RouterTestingModule } from '@angular/router/testing';
export class FakeVuiAuthServiceFalse {
isLoggedIn(): boolean {
return false;
}
}
export class FakeVuiAuthServiceReturnTrue {
isLoggedIn() {
return true;
}
}
describe('AuthGuard', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule],
providers: [AuthGuardService,
{
provide: AUTH_REDIRECT,
useValue: {
redirectTo: ''
}
},
{ provide: VuiAuthService, useClass: FakeVuiAuthServiceReturnTrue }
],
});
});
it('when user logged in should return true',
inject([AuthGuardService, VuiAuthService],
(service: AuthGuardService, dep: VuiAuthService) => {
spyOn(dep, 'isLoggedIn');
expect(service.canActivate).toBeTruthy();
}));
it('when user not logged in should return false',
inject([AuthGuardService, VuiAuthService],
(service: AuthGuardService, dep: VuiAuthService) => {
spyOn(dep, 'isLoggedIn');
expect(service.canActivate).toBeFalsy();
}));
});
你试试这样使用spyOn。
在单独的测试用例和 return 不同的值下指定 spyOn。
spyOn(AuthGuardService.prototype, 'isLoggedIn').and.callFake(() => { return true });