【问题标题】:How to test await toPromise() inside async function? (.toPromise() is not a function error)如何在异步函数中测试 await toPromise()? (.toPromise() 不是函数错误)
【发布时间】:2021-06-26 02:00:48
【问题描述】:

基于this question,我写了这个测试:

it('call service when search product by code', async() => {
    let code: string = 'CODE';
    let product: Product = createProduct();
    let properties: ProductProperties = createProductProperties();
    when(mockProductService.getProductByCode(code)).thenReturn(of(product));
    when(mockProductService.getProductProperties(product.id)).thenReturn(of(properties));

    let result: Product = await sut.searchProductByCode(code);

    expect(result.code).toEqual(product.code);
    expect(result.properties).toEqual(properties);
    verify(mockProductService.getProductByCode(code));
    verify(mockProductService.getProductProperties(product.id));
  });

我正在测试的功能是:

async searchProductByCode(code: string): Promise<Product> {
    let product = await this.productService.getProductByCode(code).toPromise(); //fails running test
    product.properties = await this.productService.getProductProperties(product.id).toPromise();
    return product;
  }

函数运行正常,但测试失败:

TypeError: this.productService.getProductByCode(...).toPromise 不是函数

是不是我没有正确地模拟服务?

productService.getProductByCode() 方法返回一个产品的 Observable:

getProductByCode(code: string): Observable<Product>

(product) 的方法创建一个产品的 Observable 对象。方法 .toPromise() 是 Observable 的一个方法,它从 observable 返回一个承诺。这里是导入:

import { of } from 'rxjs';

【问题讨论】:

  • of(product) 返回一个 Observable 的产品。 toPromise() 是 Observable 的一个方法,它从 observable 返回一个承诺。我编辑以放大有关我的代码的信息。谢谢!

标签: typescript angular6 karma-jasmine ts-mockito


【解决方案1】:

最后,更改我的关键字来搜索它,我得到了a good answer。我在嘲笑我的服务很糟糕。

这(我的代码)是错误的:

beforeEach(() => {
    mockProductService = mock(ProductService);
    mockStationService = mock(StationService);

    sut = new QuickStationChangeComponentService(
      mockProductService,
      mockStationService,
    );
  });

为了让它工作,它需要一个实例:

beforeEach(() => {
    mockProductService = mock(ProductService);
    mockStationService = mock(StationService);

    sut = new QuickStationChangeComponentService(
      instance(mockProductService),
      instance(mockStationService),
    );
  });

我专注于一种错误的搜索方式。

如果你像我一样习惯于 Java 并认为 mock(class) 返回类的模拟实例,那你就错了。如果你想要我的测试中的实例,你需要创建一个 mock 实例。

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 2016-12-31
    • 2022-01-23
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2019-05-31
    • 2020-10-03
    • 2017-07-07
    相关资源
    最近更新 更多