шпионить за средством доступа к макету - PullRequest
0 голосов
/ 27 ноября 2018

Определение зависимостей при тестировании угловых компонентов.Компонент 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 - это просто простой модульный тест класса машинописи.

...