Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 本身具有依赖性的间谍服务_Javascript_Angular_Jasmine_Ngxs - Fatal编程技术网

Javascript 本身具有依赖性的间谍服务

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

我似乎找不到下面这个问题的例子。我的NGXS状态有一个单元测试:

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,但我不得不提供它,这有点奇怪,我只是在模拟对服务的调用。谢谢你的代码,但这不是更适合于测试服务本身吗?因为在我的测试场景中,我真的不在乎是否执行了正确的请求,我想模拟整个服务方法。