繁体   English   中英

被监视的方法没有被调用-预期的间谍显示已被调用

method being spied not getting called - Expected spy show to have been called

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个sendMessage方法,它调用另一个服务( LoaderServiceshow方法。

sendMessage(url:string, body:any,httpOptions):Observable<HttpEvent<any>> {
    this.loaderService.show();
  ... //IT DOES OTHER THINGS AS WELL BUT THAT ISN'T WHAT I AM TESTING
}

我正在尝试测试是否调用了show方法,但是却出现错误Expected spy show to have been called. 我可能做错了什么? 我认为show应该被调用,因为它是sendMessage的第一行。

spec

describe('sendMessage function test suite: ',()=> {
  let loader: LoaderService;
  let httpClient:HttpClient;
  let spy:any;
  const httpOptions = {
    headers: new HttpHeaders({'Content-Type': 'application/json'}),
    withCredentials: true,
    observe: 'events',
    responseType: 'json'
  };


  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [HelperService, HttpClient, HttpHandler,LoaderService],
      imports: [ReactiveFormsModule, HttpClientModule, HttpClientTestingModule]
    });
  });

  fit('should show loader/spinner',
      inject([HttpTestingController,HelperService,HttpClient,LoaderService],(httpClient:HttpClient,httpMock:HttpTestingController)=>{
      const responseData = { result: 'success', ['additional-info']: 'some data from server' };

      loader = new LoaderService();
      spyOn(loader,'show'); //sendMessage calls show method of loader.
      let httpEvent:HttpResponse<any> = new HttpResponse<any>({body:responseData});    
      let helperService = TestBed.get(HelperService);
      let result:Observable<HttpEvent<any>> = helperService.sendMessage('/someURL','someBody',httpOptions);
      let subscription = result.subscribe((event:HttpEvent<any>)=>{
        console.log('got response ',event);
      });
      expect(loader.show).toHaveBeenCalled(); 
  }));
});
2 个回复

您监视另一个 LoaderService实例。 spyOn函数用于将间谍安装到对象中,而不是全局安装。

您可以使用TestBed.get(LoaderService)获得注入到HelperService的同一实例。

请参阅此测试-带有相关性文档的组件

上面混合的解释是正确的。 以下是我的看法,我认为我应该分享。

我想我在以前的代码中做错了几件事。 据我所知,我可以通过3种方法进行测试

1)仅使用Jasmine和Karma,而不使用Testbed。 这是一种通用方法。 我用这种方法显式创建所需的类的实例。 例如。

new LoaderService()

上面的代码对于我自己定义的类(服务和组件)非常有效。 但是,如果我的测试用例使用了某些Angular的模块(例如HttpClientModule ),那么最好使用TestBed “ Testbed是一个非常Angular的特定功能,它将负责使用DI实例化组件,服务和依赖项”

为了确保测试用例始终都引用一个类的同一实例,应使用TestBed extract所有类的实例。

fit('should show loader/spinner',()=>{
    let helperService = TestBed.get(HelperService);//extract helper service
    let loaderService = TestBed.get(LoaderService);//extract Loader Service. As I am using TestBed, I'll get the same instance of LoaderService which Angular would have used to create HelperrService
    spyOn(loaderService,'show'); //sendMessage calls hide method of loader.

    const responseData = { result: 'success', ['additional-info']: 'some data from server' };
    let httpEvent:HttpResponse<any> = new HttpResponse<any>({body:responseData});
/*HttpTestingController to be injected into tests, that allows for mocking and flushing of requests.
HttpTestingController has methods which could mock sending a request
 */
    let httpMock = TestBed.get(HttpTestingController);
    //call the sendMessage function and subscribe to its observable.
    let result:Observable<HttpEvent<any>> = helperService.sendMessage('/someURL','someBody',httpOptions);
    let subscription = result.subscribe((event:HttpEvent<any>)=>{
      console.log('got response ',event);
    });
    const mockReq:TestRequest = httpMock.expectOne('/someURL'); //Expect that a single request has been made which matches the given URL, and return its mock
    //once mocking of sending request is done, mock receiving a response. This will trigger the logic inside subscribe function
    mockReq.flush(httpEvent); //flush method provides dummy values as response

    httpMock.verify();//verify checks that there are no outstanding requests;

    expect(loaderService.show).toHaveBeenCalled(); //check that the loader show is called which in real application will show a progress bar
  });
1 预期的间谍点击已被调用

我正在测试在 Jasmine-Teaspoon 中调用元素的点击事件。 但是,我收到一个错误: “预期的间谍点击已被调用。” 在此处查看正在测试的完整代码: ReferenceError:找不到变量:onPlayerReady(使用回调时) ...

2 预期间谍已被调用

我有以下组件,其中包含一个显示模态的方法。 如果用户通过按“确定”进行确认,它将返回一个可观察的真值,如果他们取消它,它将返回一个可观察的假值。 但是我发现很难应用测试用例来检查this.onSwitchWindowClick()是否被调用响应Observable.of(true) 。 这是测试 ...

4 预期的间谍导航已被调用

我在用户登录我的 angular 应用程序(Angular 8)后创建了一条路线。 现在正在尝试编写一个测试用例。 但它给出了以下错误。 路由 ( /profile ) 页面无法调用。 登录.component.js 登录.component.spec.ts ...

5 预期的间谍“服务方法”已被调用。 - 角 10

我正在用 Angular 编写一个组件单元测试用例,但我不确定我哪里做错了。 早些时候,我写过类似的测试用例,但这个让我很头疼。 请检查这里的代码: 组件代码: Jasmine 测试用例代码: 项目最喜欢的存根文件 所以,如果 ngOnInit 失败,两个测试用例。 我也尝试过fi ...

8 错误:预期的间谍updateRates已被调用

我不断收到以下错误:每当我运行以下测试时Expected spy updateRates to have been called 。 是什么原因造成的? 我试图测试在“发件人”货币字段中输入值时是否调用了updateRates()方法。 Stackblitz: https ://st ...

9 “预期的间谍日志已被调用”问题Javascript

我在通过测试规范(以下)时遇到问题,该规范在获取失败后将调用间谍日志。 故障参考是“预期的间谍日志已被调用”。 我在handleErrors中调用的函数将输出预期的结果,因此间谍日志是我想要了解的唯一内容。 任何建议将不胜感激! 谢谢。 //Test it('should ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM