如何使用 typescript、karma 和 sinon 对包含类型联合的对象进行单元测试?

How to unit-test an object that contain a type union using typescript, karma and sinon?

我正在对一个使用 angular 框架用 typescript 编写的项目进行单元测试,方法是将 karma 与 mocha 和 chai 框架一起应用。该对象有一个接口:

interface ISolution {
    _id: string;
    paymentFrequency: PaymentFrequency;
};

PaymentFrequency 类型定义为:

type PaymentFrequency = 'MONTHLY' | 'ANNUAL' | 'SINGLE';

在控制器中,

open(solution: ISolution) { };

问题是当我尝试将解决方案模拟为:

let solution = { _id: 'aa0', paymentFrequency: 'MONTHLY', ....};
let spy = sandbox.stub(controller, 'open').withArgs(solution);

Typescript 给我的错误是 "type string is not assignable to type paymentFrequency"。让我知道是否有办法处理它。

总是可以在需要时使用 <any> 类型转换禁用测试中的类型检查,但事实并非如此。事实上,打字系统会在这里检测到一个错误,Monthly 不是 MONTHLY 并且肯定与 PaymentFrequency.

不兼容
let solution = { _id: 'aa0', paymentFrequency: 'MONTHLY', ....};

将导致推断 solution 类型,{ _id: string, paymentFrequency: string }paymentFrequency实际上是MONTHLY的信息丢失了,paymentFrequencyPaymentFrequency不兼容,solution不再与[=23=兼容].

应该是:

let solution: ISolution = { _id: 'aa0', paymentFrequency: 'MONTHLY', ....};

您可以尝试使用以下每种类型成为一个接口。因为这将严格类型检查而不是任何类型。

refer this for explanation

示例:

interface ISolution {
    _id: string;
    paymentFrequency: monthly | annual | single
};

interface monthly{
    kind:"MONTHLY"
}
interface annual{
    kind:"ANNUAL"
}
interface single{
    kind:"SINGLE"
}


var fun=(obj:ISolution)=>{
 console.log("hererer",obj)
} 
var y:monthly={kind : "MONTHLY"}
var x= { _id: 'aa0', paymentFrequency:y}
fun(x)