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

编写angular2测试并更改模拟返回值 – 让它干?

发布时间:2020-12-17 07:12:18 所属栏目:安全 来源:网络整理
导读:我正在为服务编写一些测试,我正在改变模拟函数的响应来测试各种情况.目前,每次我想更改模拟的响应时,我都需要重置TestBed并再次配置测试模块,将我的新Mocks作为依赖项注入. 我觉得必须有一个DRYer方式来编写这个规范,但我无法弄明白.有没有人有任何想法? (
我正在为服务编写一些测试,我正在改变模拟函数的响应来测试各种情况.目前,每次我想更改模拟的响应时,我都需要重置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类的地方).

(编辑:李大同)

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

    推荐文章
      热点阅读