茉莉花间谍和如何使用间谍一般

Jasmine spyOn and how to use spies generally

本文关键字:间谍 何使用 茉莉花      更新时间:2023-09-26

我刚开始接触JS单元测试,很难理解如何用Jasmine spies创建有意义的测试。

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
});