【发布时间】: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