是否可以使用 ng-mocks 从模拟服务中保留一些方法?
Is it possible to preserve some methods from a mocked service with ng-mocks?
我正在向 angular 项目添加测试。有一项服务正在从 API 获取一些数据并从该数据创建一些业务实体。
我使用 ng-mocks.
模拟此服务以测试依赖它的组件
原始服务如下所示:
class DataService {
public getEntityFromApi(): Observable<Entity> {
return http.get(...).pipe(
map(httpResponse => {
return this.createEntityFromApiData(httpResponse);
})
);
}
private createEntityFromApiData(apiData: any): Entity {
// ...
}
}
它被嘲笑为:
getMockedServiceProvider() {
const testData = ...;
return MockProvider(DataService, {
getEntityFromApi: () => {
let entity = // duplicated code from the createEntityFromApiData method to create the object from testData
return of(entity);
}
});
}
所以模拟服务能够 return 对象而无需向 API 发出请求,但我不得不从普通 json 复制创建对象的代码.
在模拟服务中避免这种重复的最佳方法是什么?
- 是否有可能以某种方式在模拟服务中保留原始服务的私有
createEntityFromApiData
?
- 我是否应该将此逻辑隔离在另一个服务中,该服务仅负责我将在测试中按原样使用的实例化?
- 其他方法?
在您的情况下,如果您想保留服务中的某些内容,则有 2 个选项:
- 保留服务本身
- 将事物提取到单独的 class / 函数中。
如果你想在所有测试中 return 相同的假数据,你可以考虑使用 ngMocks.defaultMock.
然后你需要在 src/test.ts
.
中调用一次
ngMocks.defaultMock(DataService, () => ({
getEntityFromApi: () => {
let entity = // duplicated code from the createEntityFromApiData method to create the object from testData
return of(entity);
},
}));
我正在向 angular 项目添加测试。有一项服务正在从 API 获取一些数据并从该数据创建一些业务实体。
我使用 ng-mocks.
模拟此服务以测试依赖它的组件原始服务如下所示:
class DataService {
public getEntityFromApi(): Observable<Entity> {
return http.get(...).pipe(
map(httpResponse => {
return this.createEntityFromApiData(httpResponse);
})
);
}
private createEntityFromApiData(apiData: any): Entity {
// ...
}
}
它被嘲笑为:
getMockedServiceProvider() {
const testData = ...;
return MockProvider(DataService, {
getEntityFromApi: () => {
let entity = // duplicated code from the createEntityFromApiData method to create the object from testData
return of(entity);
}
});
}
所以模拟服务能够 return 对象而无需向 API 发出请求,但我不得不从普通 json 复制创建对象的代码.
在模拟服务中避免这种重复的最佳方法是什么?
- 是否有可能以某种方式在模拟服务中保留原始服务的私有
createEntityFromApiData
? - 我是否应该将此逻辑隔离在另一个服务中,该服务仅负责我将在测试中按原样使用的实例化?
- 其他方法?
在您的情况下,如果您想保留服务中的某些内容,则有 2 个选项:
- 保留服务本身
- 将事物提取到单独的 class / 函数中。
如果你想在所有测试中 return 相同的假数据,你可以考虑使用 ngMocks.defaultMock.
然后你需要在 src/test.ts
.
ngMocks.defaultMock(DataService, () => ({
getEntityFromApi: () => {
let entity = // duplicated code from the createEntityFromApiData method to create the object from testData
return of(entity);
},
}));