首页 > 解决方案 > 测试非可选类型

问题描述

我正在审查一些测试覆盖的 TypeScript(使用 Jest)来检查一些强制属性的返回。但是,其中一些测试正在检查如果未设置某些强制性属性会发生什么,并且我不确定如何以键入的方式最好地覆盖这一点。

以下是其中一项功能的示例:

const getPrice = (product: Product): number => product.price || 0;

产品界面如下:

interface Product {
  name: string;
  price: number;
}

和测试:

describe('getPrice', ()  => {
  it('returns the price from the given order', () => {
    const mockProduct: Product = {name: 'mock product', price: 100};
    expect(getPrice(mockProduct)).toBe(100);
  });
  it('returns 0 if price is not defined in the given order', () => {
    const mockProduct: Product = {name: 'mock product'}; // Bad - Product requires price
    expect(getPrice(mockProduct)).toBe(0);
  });
});

第二个测试断言没有price财产,但是这是强制性的。我认为这样做是因为实际系统可能出乎意料地没有price(数据来自另一个服务)。

如果是这样,是否应该将price接口中的属性更改为可选?这是否也意味着来自服务的所有属性都应该是可选的?

标签: typescriptjestjs

解决方案


我认为您应该在测试中模拟真实情况。在getPrice“观点”功能中,它可以从外部服务接收任何东西。unknown因此,将部分测试对象设置为并将其转换Product为函数调用是有意义的。

这样你就向打字系统断言你知道你在做什么:“相信我!它就在Product这里……我发誓!”

像这样:

  it('returns 0 if price is not defined in the given order', () => {
    const mockProduct: unknown = {name: 'mock product'}; // Bad - Product requires price
    expect(getPrice(mockProduct as Product)).toBe(0);
  });

推荐阅读