Как написать тест жасмина для метода, который содержит глобальную переменную из другого класса / файла? - PullRequest
6 голосов
/ 18 ноября 2011

Мои тесты не пройдены по следующей причине:

ReferenceError: Не удается найти переменную: moving_canvas_context в файле (строка 5)

Я понимаю причину тестатерпит неудачу.Она не понимает переменную, поскольку она определена в отдельном файле JavaScript.Тем не менее, он объявлен глобально и работает в реальности.

Как написать тест на жасмин для этой clear_canvas функции?

JavaScript Canvas_Actions:

(function() {
  window.Canvas_Actions = (function() {
    function Canvas_Actions() {}
    Canvas_Actions.prototype.clear_canvas = function() {
      moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height);
      main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height);
      return window.canvas_objects = [];
    };
    return Canvas_Actions;
  })();
}).call(this);

Жасмин тест для Canvas_Actions:

(function() {
  describe('Canvas Actions', function() {
    return describe('clear_canvas', function() {
      return it('clears the canvases and deletes all objects', function() {
        var actions;
        jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures";
        loadFixtures("canvas_fixture.html");
        actions = new Canvas_Actions();
        actions.clear_canvas();
        return expect(canvas_objects).toEqual([]);
      });
    });
  });
}).call(this);

Ответы [ 3 ]

10 голосов
/ 18 ноября 2011

заявлено глобально и работает в реальности

Ну, это также нужно объявить при запуске теста. Таким образом, вы, вероятно, пропускаете ссылку на скрипт, где он определен в тестовом приспособлении html.

Кроме того, глобальные переменные, как правило, не очень хорошая идея, они имеют тенденцию создавать сложные ошибки. Поскольку вы уже используете jasmine в качестве среды тестирования, попробуйте абстрагировать зависимость от этой глобальной переменной в том, что вы передаете тестируемому коду. Затем используйте насмешливые способности Жасмин, чтобы проверить это.

Если вы удалите глобальные ссылки из Canvas_Actions, это может выглядеть так:

var Canvas_Actions = function(canvas) { 
  this.canvas = canvas; 
}
Canvas_Actions.prototype.clear_canvas = function(background_image) {
  var canvas = this.canvas;
  canvas.getContext().clearRect(0, 0, canvas.width, canvas.height);
  canvas.getContext().drawImage(background_image, 0, 0, canvas.width, canvas.height);
  canvas.clearObjects();
};

Вы можете смоделировать аргумент canvas с помощью жасмина и проверить Canvas_Actions в изоляции.

Как можно заметить, этот код может найти класс Canvas, и вы можете обнаружить, что clear_canvas принадлежит ему. Используйте тесты, чтобы направлять ваш дизайн, один шаг за раз.

4 голосов
/ 14 апреля 2014

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

(function() {
  describe('Canvas Actions', function() {
    beforeEach(function () {
        window.Canvas_Actions = (function() {
function Canvas_Actions() {}
Canvas_Actions.prototype.clear_canvas = function() {
  moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height);
  main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height);
  return window.canvas_objects = [];
};
return Canvas_Actions;
})();
    });
return describe('clear_canvas', function() {

  return it('clears the canvases and deletes all objects', function() {
    var actions;
    jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures";
    loadFixtures("canvas_fixture.html");
    actions = window.Canvas_Actions;
    actions.clear_canvas();
    return expect(canvas_objects).toEqual([]);
  });
});
  });
}).call(this);

РЕДАКТИРОВАТЬ: согласнокомментарии @John Henckel и @ serv-inc, по-видимому, могла бы быть ошибка (ReferenceError: window is not defined), чтобы исправить это вместо window, используйте global, например: window.Canvas_Actions измените на global.Canvas_Actions

1 голос
/ 26 июня 2019

Это похоже на JasmineJS использует свойство global. Таким образом, несмотря на ответ @ Jordão, вы можете заменить

window.Canvas_Actions = (function() {

с

global.Canvas_Actions = (function() {
...