Как избежать ложных срабатываний в тестах JavaScript - PullRequest
1 голос
/ 10 января 2012

Я разрабатываю плагин jQuery, который просматривает несколько изображений.Я пишу несколько тестов и хочу проверить, что атрибут src всегда изменяется, когда это должно быть.Беда в том, что

  • исходное изображение включено в список изображений для циклического перебора по
  • изображение, которое будет использоваться на странице, выбирается случайным образом
  • цикл контролируется setInterval, который из-за производительности системы и т. д. немного непредсказуем

Так что иногда бывает, что тест не пройден из-за случайного выбора исходного изображения из доступных, таким образомпохоже, что изменения не произошло.

Как можно избежать ложных срабатываний, подобных этим?

Ответы [ 4 ]

1 голос
/ 13 января 2012

Вы можете использовать Жасмин Шпион , чтобы проверить, что ваш метод вызывается. В частности spyMethod.callcount, который вы можете использовать для проверки количества вызовов метода.

Например. Как то так:

var cycleMethod = SpyOn(jQPlugin.theCycleMethod).andCallThrough();

waits(1000);

runs(function() {

    expect(cycleMethod.callCount).toEqual(2);

});
1 голос
/ 10 января 2012

Поскольку мы находимся в JavaScript, вы можете перезаписать Math.random следующим образом:

describe('some suite', function () {

  it('Math.random should equal 1', function () {
      var origRandom = Math.prototype.random;
      Math.prototype.random = function(){return 1};
      expect(Math.random()).toEqual(1);
      Math.prototype..random = origRandom;
  });

it('Math.random should equal 1 using jasmine', function () {
      spyOn(Math, 'random').andReturn(1)
      expect(Math.random()).toEqual(1);
  });
});

Другой способ - передать случайное число в функцию рендеринга, а не создавать ее внутри функции, которую вы хотите протестировать

0 голосов
/ 10 января 2012

В подобных случаях я делаю все возможное, чтобы мой дизайн был как можно более модульным, чтобы я мог тестировать все элементы отдельно.Похоже, вы должны сделать то же самое.Таким образом, такие вещи, как поведение setInterval, оказывают меньшее влияние на ваши тесты или не оказывают никакого влияния.

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

0 голосов
/ 10 января 2012

Вы можете использовать jquery toggle (), чтобы добавить класс при внесении изменений, а затем найти класс, который вы добавили.Вызов переключателя добавит класс, если он не существует, и удалит, если он существует, поэтому он будет установлен, если у вас должно быть новое изображение, а не если у вас должен быть оригинал.

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