我正在嘗試編寫一個基本的單元測試以使用下面的函數,但無法使其工作。我如何測試像返回適當的npm-express響應?如何正確地測試返回Mongoose查詢作爲Promise的函數
我已經看過Using Sinon to stub chained Mongoose calls,https://codeutopia.net/blog/2016/06/10/mongoose-models-and-unit-tests-the-definitive-guide/和Unit Test with Mongoose,但仍然無法弄清楚。我目前最好的猜測,以及由此產生的錯誤,低於要測試的功能。如果可能的話,我不想使用除摩卡,錫諾和柴等以外的任何東西(即不是sin-m,cha cha cha cha cha,,等)。任何其他建議,比如我能/應該在這裏測試什麼,都是受歡迎的。謝謝!
的功能進行測試:
function testGetOneProfile(user_id, res) {
Profiles
.findOne(user_id)
.exec()
.then((profile) => {
let name = profile.user_name,
skills = profile.skills.join('\n'),
data = { 'name': name, 'skills': skills };
return res
.status(200)
.send(data);
})
.catch((err) => console.log('Error:', err));
}
我的當前最佳猜測單元測試:
const mongoose = require('mongoose'),
sinon = require('sinon'),
chai = require('chai'),
expect = chai.expect,
Profile = require('../models/profileModel'),
foo = require('../bin/foo');
mongoose.Promise = global.Promise;
describe('testGetOneProfile', function() {
beforeEach(function() {
sinon.stub(Profile, 'findOne');
});
afterEach(function() {
Profile.findOne.restore();
});
it('should send a response', function() {
let mock_user_id = 'U5YEHNYBS';
let expectedModel = {
user_id: 'U5YEHNYBS',
user_name: 'gus',
skills: [ 'JavaScript', 'Node.js', 'Java', 'Fitness', 'Riding', 'backend']
};
let expectedResponse = {
'name': 'gus',
'skills': 'JavaScript, Node.js, Java, Fitness, Riding, backend'
};
let res = {
send: sinon.stub(),
status: sinon.stub()
};
sinon.stub(mongoose.Query.prototype, 'exec').yields(null, expectedResponse);
Profile.findOne.returns(expectedModel);
foo.testGetOneProfile(mock_user_id, res);
sinon.assert.calledWith(res.send, expectedResponse);
});
});
測試消息:
1) testGetOneProfile should send a response:
TypeError: Profiles.findOne(...).exec is not a function
at Object.testGetOneProfile (bin\foo.js:187:10)
at Context.<anonymous> (test\foo.test.js:99:12)
您需要檢查您的'Profile'模塊中是否定義了函數'findOne'。例如,您可能已將其定義爲「findone」。 – Mekicha
從文檔:'var stub = sinon.stub(object,「method」);' 用存根函數替換'object.method'。如果該屬性不是一個函數,則會引發異常。 – Mekicha
@Mekicha函數'findOne'在'mongoose'上定義,所以它應該從我的'Profile'模塊中委託。問題(我認爲!)與承諾結構有關。錯誤被拋出在'exec()'上,而不是在'findOne'上。任何其他想法? –