Модульное тестирование с помощью Jasmine: код в beforeEach () не виден тестовым spyOn () - PullRequest
4 голосов
/ 11 января 2012

Впервые в модульном тестировании в целом и в Жасмине в частности.

Я установил переменную в обратном вызове beforeEach(), но, похоже, он не работает во втором тесте.Предполагается запускать инициализацию перед каждым тестом в его контексте, верно?Я уверен, что мой spyOn() звонок виноват, но я не знаю, как это исправить.

Комментарии объясняют ошибки и неудачи:

describe("Test suite for my library", function () {
  var html,
      body,
      play,
...

  // custom matcher...
  beforeEach(function () {
    this.addMatchers({
      toBeInstanceOf : function (constructr) {
        return this.actual instanceof constructr;
      });
    });
  });

  describe("Within the Button object", function () {

    beforeEach(function () {
      play = new Button("play", false);
    });

    describe("play", function () {

      // This test passes, as expected...
      it("should be an instance of the Button object", function () {
        expect(play).toBeInstanceOf(Button);
      });

    });

    describe("play.name", function () {

      // This test failed with the message
      // "Expected spy Button to have been called
      //  with [ 'play', false ] but it was never called."
      it("should be the first argument passed to the Button constructor", function () {
        spyOn(window, "Button");
        play = new Button("play", false); // ...until I added this line. Now it passes.
        expect(window.Button).toHaveBeenCalledWith("play", false);
      });

      // This test passes, even if the one above fails.
      it("should be 'play'", function () {
        expect(play.name).toBe("play");
      });

    });

  });
});

документация объясняет использование, но не контекст, spyOn(), поэтому я не могу сказать, создал ли я ошибку или неосознанно использую функцию.

Iможет опубликовать конструктор, если кто-то думает, что это имеет какое-то значение в диагностике, но я могу заверить вас, что это очень просто.

Я уверен, что это простое исправление с использованием некоторой базовой концепции модульного тестирования, которую я должен изучитьТрудный путь.Заранее спасибо.

PS Я понимаю, что я тестирую в этой ошибочной спецификации не то, что я описал.Я пробираюсь через руководство по API, ищу способ добраться до массива arguments в вызове функции, чтобы я мог провести специальный тест на arguments[0].Подсказки приветствуются, но не обязательно.Я разберусь.

Ответы [ 2 ]

7 голосов
/ 12 января 2012

Краткий ответ: Нет, прежде чем каждый из шпионов станет несовместимым

Вы должны шпионить перед тем, как позвонить, если хотите, чтобы шпион узнал о вызове.Вы можете использовать spyOn (object, 'function'). AndCallThrough (), если вы не хотите вмешиваться в его поведение по умолчанию.

Длинный ответ: способы, которыми часто работают фальшивые / насмешливые / тупые / шпионские платформызаменив метод, который вы вызываете, на метод, которым может управлять фреймворк.Любые вызовы этой функции до того, как она будет заменена шпионом, не могут быть обнаружены.Это хорошо, хотя и слегка неудобно,

5 голосов
/ 12 января 2012

Это потому, что вы шпионите за окном. Кнопка после того, как вы позвонили. Я не совсем уверен, что делает шпион, но в конце концов он заменил функцию, которую вы шпионили, другой функцией, где он может проверить, была ли вызвана функция и какие аргументы были переданы. Когда вы создаете кнопку перед началом теста, вызывается оригинальная функция window.button. Затем вы заменяете функцию шпионом и проверяете, был ли вызван шпион, поэтому ваш тест должен провалиться.

Похоже, создайте свою кнопку в самом тесте или создайте шпиона, прежде чем вызывать новую кнопку в функции beforeEach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...