【问题标题】:How to use Sinon to stub a call which makes a REST request如何使用 Sinon 存根发出 REST 请求的调用
【发布时间】:2015-12-01 21:41:46
【问题描述】:

我正在尝试了解 sinon 和 mocha,我有下面的代码和测试。我正在尝试测试 findAll() 方法,但实际上并未在任何地方发出 http 请求。

使用当前代码,我收到错误[TypeError: Cannot read property 'on' of undefined]。我不确定如何存根或监视.on 事件。

/models/user.js

'use strict';

const Rest = require('restler');
const Q = require('q');

class User {

  static findAll() {
    return Q.promise(function(resolve, reject) {

      Rest.get('<SOME URL FOR DATA>')
      .on('complete', function(data, response) {

        if(data instanceof Error) {
          return reject(data);
        }

        return resolve(data);
      });
    });
  }
...
}

module.exports = User;

/test/models/user.js

'use strict';

const expect = require('chai').expect;
const sinon = require('sinon');
const Rest = require('restler');

describe('User model', function() {

  var User;

  beforeEach(function() {
    this.get = sinon.stub(Rest, 'get');
  });

  afterEach(function() {
    Rest.get.restore();
  })

  it('should not blow up when requiring', function() {
     User = require('../../models/user');
     expect(User).to.not.be.undefined;
  });

  describe('findAll()', function() {
    it('should return all users', function() {

      const expected = [{personId: 1234}, {personId: 1235}];

      User.findAll()
      .then(function(result) {
        console.log('result = ', result);
      })
      .fail(function(err) {
        console.log('err = ', err);
// KEEPS DISPLAYING THIS: err =  [TypeError: Cannot read property 'on' of undefined]
      })
    });
  });

});

【问题讨论】:

  • 那是因为Rest.get(...) 什么都不返回。
  • 尝试用“.then”替换“.on('complete',”,如果有效,请告诉我。请发布“require('restler')”的内容
  • .on 是正确的。 github.com/danwrong/restler
  • @zerkms 那么你能帮我找到正确的解决方案吗?
  • 我可以给你更多提示:Rest.get() 应该返回什么?如何使用sinon 设置预定义的返回值?

标签: javascript unit-testing mocha.js sinon


【解决方案1】:

如前所述,Rest.get() 返回 undefined,而 findAll 方法要求它返回带有 on 类型为 function 的属性的 object。使用 sinon,您可以控制使用 stub.returns API 调用时存根返回的值。您还需要确保调用传递给on 方法的回调。您可以使用stub.yields API 来实现此目的。 如果您需要严格并验证附加回调的位置,请使用stub.callsArgWith(1, expected)

示例

describe('findAll()', function() {
  it('should return all users', function() {
    const expected = [{personId: 1234}, {personId: 1235}];
    Rest.get.returns({
      on:sinon.stub().yields([expected])
    });
    User.findAll()
    .then(function(result) {
      console.log('result = ', result);
    });
  });
});

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2021-07-26
    • 2013-03-06
    • 2017-09-30
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多