Мы создали этот метод util при работе над Phonetradr , который может дать вам безопасный доступ к глубоким свойствам с помощью TypScript:
/**
* Type-safe access of deep property of an object
*
* @param obj Object to get deep property
* @param unsafeDataOperation Function that returns the deep property
* @param valueIfFail Value to return in case if there is no such property
*/
export function getInSafe(obj: O, unsafeDataOperation: (x: O) => T, valueIfFail?: any) : T {
try {
return unsafeDataOperation(obj)
} catch (error) {
return valueIfFail;
}
}
//Example usage:
getInSafe(sellTicket, x => x.phoneDetails.imeiNumber, '');
//Example from above
getInSafe(foo, x => x.bar.check, null);
Возможно, есть способ сделать это, но в большинстве случаев вы не захотите этого делать. Ваши модульные тесты не должны зависеть от скрытых реализаций или кода. Рассматривайте свои классы как "черные ящики", когда вы тестируете их, где у вас есть доступ только к изменению входных данных и тестированию выходных.
Если вы тестируете выполнение приватных методов, то, скорее всего, вы слишком глубоко погружаетесь в реализацию данного класса и затрудняете изменение своей реализации в будущем без нарушения тестов.
Я согласен с ответом mjd79, однако если вы привержены идее проверки того, что ReportFailure был вызван, вы можете изменить уровень защиты метода на Internal
, и установить атрибут InternalsVisibleTo
на вашей сборке так, чтобы он позволял вашим модульным тестам обращаться к нему.
Более эффективным подходом может быть создание макета ресурса, к которому обращается ReportFailure, и проверка того, что вызывается какой-либо публичный метод этого макета.