【问题标题】:Angular Unit Test: How to unit test .map()?Angular 单元测试:如何对 .map() 进行单元测试?
【发布时间】:2019-11-02 04:35:51
【问题描述】:

我需要测试一种服务方法,但我不确定如何为调用某些注入服务方法而运行的部分代码实现 100% 的代码覆盖率。

待测试的服务方法:

@Injectable()
export class BomRevisiosnsService {
  constructor(
    private baseService: BaseService,
    private appConstants: AppConstants,
    private dmConstants: DMConstants
  ) { }

  public getRevisionsData(): any {
    var itemId = this.appConstants.userPreferences.modelData['basicDetails']['itemId'];
    let url = this.dmConstants.URLs.GETBOMREVISIONS + itemId + "/GetRevisionsAsync";
    let headers = {
      "Content-Type": "application/json",
      UserExecutionContext: JSON.stringify(this.appConstants.userPreferences.UserBasicDetails),
    }
    if (itemId != null || itemId != undefined) {
      return this.baseService.getData(url, headers)
        .map(response => {
          // this area not getting covered.
          return response;
        });
    }
  }
}

我如何覆盖:

.map(response => {
  return response;
});

如下:

测试:

it('should return response if itemId is not null or undefined', () => {
  let mockData = [1,2,3];
  let mockObservable = Observable.of(mockData);
  spyOn(baseService, 'getData').and.returnValue(mockObservable);
  appConstants.userPreferences.modelData['basicDetails']['itemId']=4; // itemId not null or undefined
  dMConstants.URLs.GETBOMREVISIONS ="dummy url";
  subject.getRevisionsData();
  expect(baseService.getData).toBe(mockData); // How do I test .map()?
});

【问题讨论】:

  • 您可以创建一个函数,在其中传递响应数据并稍后对其进行测试。使用 spyOn,您可以确保它已被调用。
  • 反问 - 你真的认为这需要测试吗?这似乎是在测试像+ 这样的运算符的基本功能。虽然如果你真的想检查用于映射的基本恒等函数是不是一个基本恒等函数,那为什么不把它分开,单独为那个函数写一个测试呢?
  • @VLAZ 不,我认为它不会为单元测试增加任何价值。但出于好奇,我想弄清楚。
  • 有没有想过这个问题?我正在反对这一点。如果将地图操作变成一个方法并单独测试它,我会怎么做。不理想,因为该方法应该是私有的,但测试必须公开(我相信)。
  • @eflat 查看标记的答案

标签: javascript angular unit-testing jasmine angular-unit-test


【解决方案1】:
it('should return response if itemId is not null or undefined', () => {
  ...
  const spy = spyOn(baseService.getData).and.return(mockedData)// you need to define data returned by baseService.getData
  const result = subject.getRevisionsData();
  expect(spy).toHaveBeenCalled(); // How do I test .map()?
  expect(result).toEqual(mockedData);// for simple map it will be the same thing that is returned for more complicated map it may differ
});

【讨论】:

  • 我的测试仍然失败。我收到Expected [ 1, 2, 3 ] to be [ 1, 2, 3 ].
  • 并且没有可用的toBeEqual 方法。只有我在使用 toBe()
  • 抱歉是凭记忆做的
猜你喜欢
  • 2021-10-07
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多