2

我从 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 的调用是硬编码在规范中的。但与此同时,我想确保传递的参数是一个数组,而不是其他类型……它的硬编码我确信它是错误的。

有人可以就我应该如何思考/处理这种类型的测试场景提供一些指导吗

4

1 回答 1

1

好吧,间谍对于一些不同的场景很有用。很大程度上取决于您自己如何定义单元测试的范围。如果您执行最小可能的单元(即方法),那么让我们想象以下内容:

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
});
于 2016-10-05T22:00:00.927 回答