8

我正在为应用程序使用超级代理 ajax 库,并且正在尝试为它编写一些单元测试。我有一个看起来像这样的类:

someClass = {
  getData: function(){
    _this = this;
    superagent.get('/some_url').end(function(res){
      if(res.body){
        _this.data = res.body
      }
     });
   });
 }

如何编写 Jasmine 测试来监视_this.data = res.body通话?and.callThrough()使用on设置间谍getData不起作用。我不想实际调用有问题的 URL;我只是想测试一下,如果它得到数据,它会用它做些什么。

谢谢

4

4 回答 4

3
spyOn(superagent, 'get').and.callFake(function(url) {
  return {
    end: function(cb) {
      //null for no error, and object to mirror how a response would look.
      cb(null, {body: data});
    }
  }
});
于 2015-07-14T16:02:07.113 回答
0

兄弟的答案完美无缺。为了给他的答案添加一些东西,当我们需要在方法中添加另一个超级代理函数(如set)时spyOn,您可以使用如下。

spyOn(superagent, 'get').and.callFake(function(url) {
  return {
      set: function() {
        return {
          end: function(cb) {
            //null for no error, and object to mirror how a response would look.
            cb(null, {body: data});
          }
        }
     }
});

在这里,set 函数用于设置请求的标头。

于 2015-08-07T11:50:01.467 回答
0

说是patch,先做一个mock patch返回值:

this.mockPatchObject = {
      set: () => {
        return {
          end: (cb: any) => {
            cb(null, {body: 'etc'});
          },
        };
      },
    };

然后将其作为补丁的值返回:

this.superagentSpy = spyOn(request,'patch').and.returnValue(this.mockPatchObject);

然后窥探“模拟”补丁对象的 set 函数:

this.superagentSetSpy = spyOn(this.mockPatchObject, 'set');
于 2017-07-06T17:27:13.273 回答
0

这里还有一个很好的解决方案,就是抽象出匿名函数:

someClass = {
  getData: function(){
    _this = this;
    superagent.get('/some_url').end(this.handleAjax);
  },

  handleAjax: function(res){
    if(res.body){
      _this.data = res.body
    }
  }
}

现在您可以通过简单的测试离散地测试handleAjax 函数;并且还存根超级代理,因为您只需要检查一个方法.end()是否以特定值调用它。

匿名函数存在问题的原因不仅仅是测试,因此这是一个很好的重构

于 2017-04-25T10:25:52.767 回答