如何使用 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
的信息丢失了,paymentFrequency
与PaymentFrequency
不兼容,solution
不再与[=23=兼容].
应该是:
let solution: ISolution = { _id: 'aa0', paymentFrequency: 'MONTHLY', ....};
您可以尝试使用以下每种类型成为一个接口。因为这将严格类型检查而不是任何类型。
示例:
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)
我正在对一个使用 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
的信息丢失了,paymentFrequency
与PaymentFrequency
不兼容,solution
不再与[=23=兼容].
应该是:
let solution: ISolution = { _id: 'aa0', paymentFrequency: 'MONTHLY', ....};
您可以尝试使用以下每种类型成为一个接口。因为这将严格类型检查而不是任何类型。
示例:
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)