typescript - 测试非可选类型
问题描述
我正在审查一些测试覆盖的 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
接口中的属性更改为可选?这是否也意味着来自服务的所有属性都应该是可选的?
解决方案
我认为您应该在测试中模拟真实情况。在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);
});
推荐阅读
- linux - 在 Raspberry pi 4 linux 启动时自动启动时执行“dotnet ~.dll”时出错
- powershell - Powershell .value 与 .values
- javascript - 如何获取为浏览器上的文件输入选择的图像尺寸
- angular - ag-Grid:我如何对 ICellRendererAngularComp 进行单元测试
- bash - awk 和 printf 插入额外的换行符
- c# - AJAX 成功/错误功能不起作用
- go - Golang:如何将 time.Time 转换为 Protobuf 时间戳?
- ios - 根据 MapKit 中的缩放级别动态更改 MKAnnotationView?
- html - 视图 account.views.updatedata 没有返回 HttpResponse 对象。它返回 None 而不是
- bamboo - /media/atlassian-data 文件系统已 100% 满