如何使用 Sinon 对发出 REST 请求的调用进行存根
How to use Sinon to stub a call which makes a REST request
我正在尝试了解 sinon 和 mocha,我有下面的代码和测试。我正在尝试测试 findAll()
方法而不实际在任何地方发出 http 请求。
使用当前代码我得到错误 [TypeError: Cannot read property 'on' of undefined]
。我不确定如何存根或监视 .on
事件。
/modles/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()
returns undefined
而 findAll
方法需要 returns 一个 object
和 on
属性 类型 function
。使用 sinon,您可以控制在使用 stub.returns
API 调用时存根 returns 的值。您还需要确保调用传递给 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);
});
});
});
我正在尝试了解 sinon 和 mocha,我有下面的代码和测试。我正在尝试测试 findAll()
方法而不实际在任何地方发出 http 请求。
使用当前代码我得到错误 [TypeError: Cannot read property 'on' of undefined]
。我不确定如何存根或监视 .on
事件。
/modles/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()
returns undefined
而 findAll
方法需要 returns 一个 object
和 on
属性 类型 function
。使用 sinon,您可以控制在使用 stub.returns
API 调用时存根 returns 的值。您还需要确保调用传递给 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);
});
});
});