Определение зависимостей при тестировании угловых компонентов.Компонент A внедряет ServiceA, я хочу смоделировать serviceA в моем тесте
class ServiceA {
private _prop = 1;
get prop (): number {
return this._prop;
}
set prop(p: number) {
this._prop;
}
}
class ComponentA {
private injectedService: ServiceA;
constructor(private injectedService: ServiceA) {
this.injectedService = injectedService;
}
method () {
this.injectedService.prop = this.injectedService.prop + 1;
if (this.injectedService.prop === 5) {
this.injectedService.prop = 1;
}
}
}
При описанной выше структуре программы важно иметь mock serviceA, который имеет реализацию accessor (getter и setter for injectedService.prop), так какчасть программы зависит от значения injectedService.prop, которое было предварительно установлено.
Опции, которые я пробовал:
ts-mockito: ts-mockito mocks не имеет установленного типа доступа .С этим ограничением установщик не будет распознан.Обходной путь должен был бы определить фактические методы для «установки» и «получения» и вызова этих методов.Для установки все равно потребуется обходной путь, как показано ниже:
// default get stub
when(mock.getProp()).thenReturn();
// setter redefines get stub
when(mock.setProp(anything())).thenCall((p) => {
when(mock.getProp()).thenReturn(a);
});
typemoq:
статический макет вызывает конструктор, большой недостаток, когда целевой фиктивный класс, как и другие внедрения зависимостей
динамическая имитация условия, подобные (this.injectedService.prop ===5) никогда не будет правдивым, потому что this.injectedService.prop (т.е. mock.object.prop) указывает на функцию.В этом я чувствую, что может быть способ, который мне еще предстоит выяснить, я был бы признателен за любую помощь
(Личные предпочтения) Я предпочитаю жасмин spyOn typemoq проверьте для утверждений на моих издевательствах.Это может быть проигнорировано, если невозможно.
Вещи, которые я не хочу делать
Я не хочумодифицировать классы, которые нужно смоделировать, кроме добавления стандартных средств доступа к машинописи
Я не хочу создавать интерфейсы / классы для классов, которые должны быть смоделированы только с целью создания макета для теста
Хотя я открыт для компромисса, если есть хорошее обоснование или стандарт
Я также был бы признателен, если бы кто-нибудь мог направить менякодовая (ые) база (ы), которая имеет надлежащий тест и соответствует стандарту , если есть .
Примечание: я тестирую угловое приложение с кармой + жасмин ... но все это не считаетсяпоскольку я просто создаю класс из конструктора, никакой Testbed - это просто простой модульный тест класса машинописи.