繁体   English   中英

Jasmine spyOn和一般如何使用间谍

[英]Jasmine spyOn and how to use spies generally

我开始进行JS单元测试,并且很难了解如何使用Jasmine间谍创建有意义的测试。

it('should take an array of shopping items', function() {
  spyOn(checkObj, 'getTotal');
  checkObj.getTotal([1, 2, 3]);
  expect(checkObj.getTotal).toHaveBeenCalledWith(jasmine.any(Array));
});

使用我创建的上述测试摘录作为示例,我无法看到这是一个有用的测试,因为我对getTotal的调用是在规范中进行硬编码的。 但同时我想确保传递的参数是一个数组,而不是其他类型...它的硬编码我肯定是错误的。

有人可以就如何思考/接近这种类型的测试场景提供一些指导

嗯,间谍对于有点不同的场景很有用。 很大程度上取决于您自己如何定义单元测试的范围。 如果你做了最小可能的单位(即方法),那么让我们想象如下:

var x = function() { }
x.prototype.f1 = function() { 
        //do something 
        },
x.prototype.f2 = function(){
          // do something else
          this.f1();
        }

现在,在f2的单元测试中,你对f1的工作原理不感兴趣。 所以,你是间谍:

var a = new x();
a.f1 = jasmine.createSpy("spy-on-f1");
expect(a.f1).not.toHaveBeenCalled();
a.f2();
expect(a.f1).toHaveBeenCalled();

例如,对于angularjs应用程序,我经常使用间谍模拟整个服务,只是为了在测试中隔离算法。

作为奖励,你实际上可以用这样的假函数替换真正的函数:

a.f1 = jasmine.createSpy("fake-spy").and.callFake(function(){
    // do something predictible or return global variable that can be set externaly
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM