Как выполнить модульное тестирование объекта, содержащего объединение типов, с использованием машинописного текста, кармы и синона?

Я выполняю модульное тестирование проекта, написанного на машинописном языке с использованием угловых фреймворков, применяя карму с фреймворками 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 выдал мне ошибку, поскольку «строка типа не может быть назначена для типа paymentFrequency». Дайте мне знать, если есть способ справиться с этим.


person khet    schedule 09.03.2018    source источник


Ответы (2)


Вы можете попробовать использовать следующий каждый тип, который становится интерфейсом. Потому что вместо any это будет строго проверять тип.

см. это для объяснения

Пример:

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)
person Neha Tawar    schedule 09.03.2018
comment
Большое спасибо за ответ. Я попытался использовать его, и это решило проблему. Потребовалось некоторое время, чтобы ответить вам, потому что у меня нет права изменять дизайн интерфейса, поэтому я сначала попытался смоделировать все интерфейсы, а затем протестировал их. - person khet; 11.03.2018

При необходимости всегда можно отключить проверку типов в тестах с приведением типов <any>, но это не тот случай. На самом деле система набора обнаружит здесь ошибку, Monthly не MONTHLY и уж точно не совместима с PaymentFrequency.

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

приведет к предполагаемому типу solution, { _id: string, paymentFrequency: string }. Информация о том, что paymentFrequency на самом деле является MONTHLY, утеряна, paymentFrequency несовместима с и PaymentFrequency, а solution больше не совместима с ISolution.

Должен быть:

let solution: ISolution = { _id: 'aa0', paymentFrequency: 'MONTHLY', ....};
person Estus Flask    schedule 09.03.2018
comment
Большое спасибо за ответ. На самом деле, это была моя опечатка, и в коде она уже «ЕЖЕМЕСЯЧНО», а не «ежемесячно», и я уже исправил ее в своем вопросе. - person khet; 09.03.2018
comment
Я понимаю. Это было хорошим замечанием о том, почему именно вам не следует прибегать к ‹any› до того, как вы действительно должны это сделать. Я ожидаю, что let solution: ISolution будет работать на вас. - person Estus Flask; 09.03.2018
comment
Еще раз спасибо за ваш ответ. Я попробовал разрешить решение: ISolution, и оно дало мне неопределенность, когда я попытался передать его функции и проверил результат. - person khet; 11.03.2018