避免javascript测试中的误报



我正在开发一个jQuery插件,它可以循环处理许多图像。我正在写一些测试,想测试src属性是否总是在应该更改的时候更改

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

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

我该如何避免此类误报?

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

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

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

例如。类似这样的东西:

var cycleMethod = SpyOn(jQPlugin.theCycleMethod).andCallThrough();
waits(1000);
runs(function() {
    expect(cycleMethod.callCount).toEqual(2);
});

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

在这种情况下,我会特别注意使我的设计尽可能模块化,这样我就可以单独测试所有的部分。听起来你也应该这么做。这样,像setInterval的行为这样的事情对测试的影响较小或没有影响。

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

最新更新