Javascript 本身具有依赖性的间谍服务
我似乎找不到下面这个问题的例子。我的NGXS状态有一个单元测试:Javascript 本身具有依赖性的间谍服务,javascript,angular,jasmine,ngxs,Javascript,Angular,Jasmine,Ngxs,我似乎找不到下面这个问题的例子。我的NGXS状态有一个单元测试: describe('Project store', () => { let store: Store; let projectService: ProjectService; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NgxsModule.forRoot([Pr
describe('Project store', () => {
let store: Store;
let projectService: ProjectService;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [NgxsModule.forRoot([ProjectState])]
}).compileComponents();
projectService = new ProjectService(); // error: needs httpClient
store = TestBed.get(Store);
}));
it('should load projects', () => {
const EXPECTED_PROJECTS = [
{
"id": "1",
"description": "abc"
},
{
"id": "1",
"description": "abc"
}
] as Project[];
spyOn(projectService, 'loadProjects').and.returnValue(EXPECTED_PROJECTS);
const expected: ProjectStateModel = {
loadedProjects: EXPECTED_PROJECTS,
createdProjects: []
};
store.dispatch(new LoadProjects());
const actual = store.selectSnapshot(ProjectState.getState);
expect(actual).toEqual(expected);
});
});
当ProjectService本身需要httpClient
时,如何监视它
我找到了一些示例,介绍了如何测试需要httpClient
的服务,但现在介绍了如何模拟需要客户端的服务
现在我知道我可以自己编写一个模拟服务,但我正在尝试找出是否可以使用jasmine spies来完成。您可以使用HttpTestingController
来模拟您的服务所需的响应,请参见下面的代码:
describe('Project store', () => {
let store: Store;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
NgxsModule.forRoot([ProjectState])
],
providers: [ProjectService]
}).compileComponents();
store = TestBed.get(Store);
}));
it('should load projects',
inject([HttpTestingController], (controller: HttpTestingController) => {
const EXPECTED_PROJECTS = [
{ 'id': '1', 'description': 'abc' },
{ 'id': '1', 'description': 'abc' }
] as Project[];
const expected = {
'projectsState': <ProjectStateModel>{
loadedProjects: EXPECTED_PROJECTS,
createdProjects: []
}
};
store.dispatch(new LoadProjects());
// expecting one GET request as a result of LoadProjects action
const testReq = controller.expectOne(req => req.method === 'GET');
// provide mock response
testReq.flush(EXPECTED_PROJECTS);
const actual = store.selectSnapshot(ProjectState.getState);
expect(actual).toEqual(expected);
}));
});
description('项目存储',()=>{
让店:店;
beforeach(异步(()=>{
TestBed.configureTestingModule({
进口:[
HttpClientTestingModule,
NgxsModule.forRoot([ProjectState])
],
提供者:[项目服务]
}).compileComponents();
store=TestBed.get(store);
}));
它('应该加载项目',
注入([HttpTestingController],(控制器:HttpTestingController)=>{
预期的工程量=[
{'id':'1','description':'abc'},
{'id':'1','description':'abc'}
]作为项目[];
预期常数={
“项目状态”:{
加载的项目:预期的\u项目,
createdProjects:[]
}
};
store.dispatch(new LoadProjects());
//LoadProjects操作的结果应为一个GET请求
const testReq=controller.expectOne(req=>req.method=='GET');
//提供模拟响应
testReq.flush(预期的_项目);
const actual=store.selectSnapshot(ProjectState.getState);
预期(实际)。toEqual(预期);
}));
});
您不应该自己更新它,这就是测试床(通常是DI)的用途。但基本上,您需要提供所创建内容的依赖关系,在本例中,可以使用HttpClientTestingModule,也可以只创建自己的“客户端”测试。但是在那一点上,为什么不加倍服务呢?@jornsharpe是的,我想这就是我要做的。我会通过测试床得到服务,然后在上面做spyOn。虽然我没有使用HttpClient,但我不得不提供它,这有点奇怪,我只是在模拟对服务的调用。谢谢你的代码,但这不是更适合于测试服务本身吗?因为在我的测试场景中,我真的不在乎是否执行了正确的请求,我想模拟整个服务方法。