Ложные вспомогательные классы в Жасминовом модульном тесте - PullRequest
0 голосов
/ 14 февраля 2019

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

import { MyHelperClass } from "./my-helper-class";

export class MyComponent {
    public doStuff() {
        const helper = new MyHelperClass();
        if (helper.check()) {
            // code I want to test
        }
    }
}

Я хочу исключить функциональность helper.check() из модульного теста и просто предположить, что он возвращает true (или false во втором тесте).Поэтому я хочу, чтобы мой тест выглядел примерно так:

it("#doStuff should do something, assuming helper.check() is true, () => {
    // make constructor of MyHelperClass return a Mock
    // (or somehow spy on helper.check() and return true?) 

    expect(component.doStuff()).toBe(someValue);
});

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете настроить шпиона, который будет высмеивать вызов функции и возвращать любое значение, которое вы хотите для check().Это также позволяет вам проверить, была ли эта функция действительно запущена (например, шпион и сколько раз и т. Д.).

Сложность в том, что если у вас нет экземпляра класса, вам нужнонастройте вашего шпиона на prototype вашего класса.

Посмотрите на этот код (dummyVariable это просто переменная для проверки, был ли выполнен код после check() или нет):

it('doStuff should do something, assuming helper.check() is true', () => {
  // test the before value
  expect(component.dummyVariable).toBe(false);

  // set up the spy and make it return true
  const spy = spyOn(MyHelperClass.prototype, 'check').and.returnValue(true);

  // call our function
  component.doStuff();

  // check the after value
  expect(component.dummyVariable).toBe(true);

  // check if our spy/mocked function was actually called
  expect(spy).toHaveBeenCalledTimes(1);
});

// same thing as above but this time our spy returns false
it('doStuff should do something, assuming helper.check() is false', () => {
  expect(component.dummyVariable).toBe(false);
  const spy = spyOn(MyHelperClass.prototype, 'check').and.returnValue(false);
  component.doStuff();
  expect(component.dummyVariable).toBe(false);
  expect(spy).toHaveBeenCalledTimes(1);
});

Рабочий пример можно найти здесь .

...