typescript 我如何使用Jasmine/Karma测试来侦测一个Angular HTTP Post调用并返回一个假值?

pkln4tw6  于 2023-01-18  发布在  TypeScript
关注(0)|答案(1)|浏览(146)

我在这里使用的是Angular 测试文档,具体来说,我想测试HTTP服务(模拟/监视HTTP调用并返回一个伪值)。
下面是代码:

describe('DataService', () => {
  let service: DataService;
  let httpClientSpy: jasmine.SpyObj<HttpClient>

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [DataService]
    });
    httpClientSpy = jasmine.createSpyObj('HttpClient', ['sendRequest$'])
    // service = TestBed.inject(DataService);
    service = new DataService(httpClientSpy);
  });

  it('should return expected results', () => {

    let obj = JSON.stringify(data);
    console.log(obj);

    let newOjb = <SpecificObject>JSON.parse(obj);
    console.log(newOjb);

    httpClientSpy.post.and.returnValue(of(newOjb));

    service.sendRequest$.subscribe({
      next: data => {
        expect(data)
          .withContext('expected data')
          .toEqual(newOjb);
      }
    });
    expect(httpClientSpy.post.calls.count())
      .withContext('one call')
      .toBe(1);
  });

服务. ts文件:

sendRequest$ = this.requestSubjectAction$.pipe(
  switchMap(someRequest => this.http.post<SpecificObject>(this.PCFUrl, someRequest)),
  tap(data => console.log(data))
);

但是,我不断得到错误:TypeError: Cannot read properties of undefined (reading 'and')在我的控制台和当Karma打开Chrome运行测试。
失败的行具体为:httpClientSpy.post.and.returnValue(of(newOjb));这只是那行代码的"and"部分失败了。这是直接从Angular得到的,所以我不知道该怎么做。
我试着把httpClientSpy.post.and.returnValue(of(newOjb));改成get,我试着改变其他的东西,但是它总是在and上失败,我不知道为什么。有更好的方法来测试这个吗?

    • 注意**:我使用的是***声明性***rxjs http调用,这就是方法调用后面有$的原因,因为它是一个变量。

任何帮助都是感激的!

nhn9ugyo

nhn9ugyo1#

再次查看文档。
由于尚未定义post的模拟,因此将出现未定义的情况
您已经将您的服务与模拟http合并。
改为:

httpClientSpy = jasmine.createSpyObj('HttpClient', ['post']);

根据以下评论进行更新:
您的服务调用是异步的。您应该在同一个位置运行所有Assert。
想想流程:
1.调用服务.sendRequest$。
1.您的测试会立即继续检查是否调用了http方法。
1.但在大多数情况下,它不会,因为这是一个典型的种族条件。
1.由于您的代码是在jasmine测试本身认为它已经“完成”之后才真正完成的,因此您必须传入done函数以便手动触发。https://jasmine.github.io/tutorials/async

it('should return expected results', (done) => {

    let obj = JSON.stringify(data);
    console.log(obj);
    let newOjb = <SpecificObject>JSON.parse(obj);
    console.log(newOjb);

    httpClientSpy.post.and.returnValue(of(newOjb));

   service.sendRequest$.subscribe({
      next: data => {
        expect(data)
          .withContext('expected data')
          .toEqual(newOjb);

        expect(httpClientSpy.post.calls.count())
        .withContext('one call')
        .toBe(1);
 
       done();

      }
    });
}

相关问题