编写angular2测试并更改模拟返回值 – 让它干?
我正在为服务编写一些测试,我正在改变模拟函数的响应来测试各种情况.目前,每次我想更改模拟的响应时,我都需要重置TestBed并再次配置测试模块,将我的新Mocks作为依赖项注入.
我觉得必须有一个DRYer方式来编写这个规范,但我无法弄明白.有没有人有任何想法? (我知道我可以将此服务的测试编写为标准的ES6类,但是我使用Http响应模拟来自angular的东西的组件和服务得到了相同的场景.) 这是我的spec文件: import { TestBed,inject } from '@angular/core/testing'; import { Observable } from 'rxjs/Observable'; import { UserService,RestService } from '../index'; import { User } from '../../../models/index'; let getUserSpy = jasmine.createSpy('getUser'); let upsertUserSpy = jasmine.createSpy('upsertUser'); // NOTE that initally,the MockRestService throws errors for all responses class MockRestService { getUser = getUserSpy.and.returnValue(Observable.throw('no thanks')); upsertUser = upsertUserSpy.and.returnValue(Observable.throw('no thanks')); } describe('User service - ',() => { let service; /** * First TestBed configuration */ beforeEach(() => { TestBed.configureTestingModule({ providers: [ UserService,{ provide: RestService,useClass: MockRestService,} ] }); }); beforeEach(inject([UserService],(user: UserService) => { service = user; })); /* ... tests ... */ describe('getUser/ upsertUser succeeds with INVALID user - ',() => { /** * Altering mock */ class MockRestService { getUser = getUserSpy.and.returnValue(Observable.of({json: () => { return {name: 'dave'}; }})); upsertUser = upsertUserSpy.and.returnValue(Observable.of({json: () => {}})); } /** * Reset and reconfigure TestBed. Lots of repetition! */ beforeEach(() => { TestBed.resetTestingModule(); }); beforeEach(() => { TestBed.configureTestingModule({ providers: [ UserService,{ provide: RestService,} ] }); }); beforeEach(inject([UserService],(user: UserService) => { service = user; })); /* ... tests ... */ }); describe('getUser/upsertUser succeeds with valid user',() => { const validResponse = { json: () => { return { firstName: 'dave',lastName: 'jones',email: 'dave@gmail.com' }; } }; /** * Altering mock */ class MockRestService { getUser = getUserSpy.and.returnValue(Observable.of(validResponse)); upsertUser = upsertUserSpy.and.returnValue(Observable.of(validResponse)); } /** * Reset and reconfigure testbed. Lots of repetition! */ beforeEach(() => { TestBed.resetTestingModule(); }); beforeEach(() => { TestBed.configureTestingModule({ providers: [ UserService,(user: UserService) => { service = user; })); /* ... tests ... */ }); }); 解决方法
它可能是一些变化
function setupUserTestbed() { beforeEach(() => { TestBed.configureTestingModule({...}); }); afterEach(() => { TestBed.resetTestingModule(); }); } ... setupUserTestbed(); ... setupUserTestbed(); 但是描述块的目的(除了在测试报告中对规范进行分组)是以最有效的方式排列在*之前和之后的块. 如果顶级描述块具有beforeEach块,则可以确定它会影响嵌套描述块中的规范.如果describe块是兄弟,则应将常见行为移至顶级描述.如果兄弟描述块没有顶级描述,则应该创建它. 在发布的代码中,顶级描述(‘用户服务 – ‘,()=> {…})已经具有带有TestBed.configureTestingModule,TestBed.resetTestingModule(它应该在afterEach中执行)和注入的beforeEach块.没有必要在嵌套的describe块中复制它们. MockRestService类的配方与在规范之间交替的任何模拟相同.它应该是一个let / var变量: describe(... let MockRestService = class MockRestService { ... }; beforeEach(() => { Testbed... }); describe(... MockRestService = class MockRestService { ... }; beforeEach(inject(...)); 这种模式可能有很多变化.类本身可以是常量,但getUser和upsertUser属性可以交替: let getUserSpy; let upsertUserSpy; class MockRestService { getUser = getUserSpy; ... } describe(... beforeEach(() => { Testbed... }); beforeEach(() => { getUserSpy = jasmine.createSpy().and.returnValue(...); ... }); describe(... beforeEach(() => { getUserSpy = jasmine.createSpy().and.returnValue(...); ... }); beforeEach(inject(...)); 这也解决了一个重要问题,因为间谍应该在每个规范中都是新鲜的,即在beforeEach中定义.可以在Testbed配置之后但在注入之前重新分配getUserSpy和upsertUserSpy(这可能是实例化MockRestService类的地方). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |