避免在javascript测试中出现误报

时间:2012-01-10 00:28:22

标签: javascript unit-testing jasmine

我正在开发一个循环浏览大量图片的jQuery插件。我正在编写一些测试,并希望测试src属性是否应该始终被更改。麻烦的是

  • 原始图像包含在图像列表中以循环显示
  • 页面中使用的图像是随机选择的
  • 循环由setInterval控制,由于系统性能等原因,它有点不可预测

因此,有时由于原始图像是从可用的图像中随机选择的,测试可能会失败,因此看起来没有发生变化。

我怎样才能避免像这样的误报?

4 个答案:

答案 0 :(得分:1)

由于我们使用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);
  });
});

另一种方法是将随机数传递给渲染函数,而不是在你想测试的函数内部创建

答案 1 :(得分:1)

您可以使用jasmine Spy behaviour检查是否正在调用您的方法。特别是spyMethod.callcount,您可以使用它来检查方法被调用的次数。

例如。像这样:

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

waits(1000);

runs(function() {

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

});

答案 2 :(得分:0)

您可以使用jquery toggle()在进行更改时添加类,然后搜索您添加的类。如果它不存在,调用切换将添加一个类,如果它存在则删除它,因此如果你应该有一个新图像,它将被设置,而不是如果你应该有原始图像。

答案 3 :(得分:0)

在这种情况下,我特别注意尽可能使我的设计模块化,因此我可以分别测试所有的零碎。听起来你应该这样做。这样,setInterval的行为等对您的测试产生的影响较小或没有影响。

例如,您应该有专门的方法来选择下一个URL,您可以独立于其余代码进行测试。出于该方法的目的,您不关心原始图像是否在列表中,因为对于测试,您可以将图像列表设置为您想要的任何内容。在测试中,我会多次调用该方法,存储每次调用的结果,然后我断言每个结果中都没有相同的字符串。