gpt4 book ai didi

node.js - 带有 Mongoose 调用的 Mocha 测试功能

转载 作者:搜寻专家 更新时间:2023-11-01 00:18:08 26 4
gpt4 key购买 nike

在对下面的代码进行单元测试时遇到了一些问题,由于它的编码方式,我不确定它是否可行。

storeModel.js

var storeSchema = new Schema({
storeId : { type: String, index: true},
storeName : String
});
var model = mongoose.model('store', storeSchema);

var findStoresById = function(ids, callback) {
model.find({ storeId: { $in: ids }}, function (err, result) {
if (err) callback(err);
callback(err, result);
});
};

return {
findStoresById: findStoresById,
schema: storeSchema,
model: model
};}();

我是这样测试的..

it('will call "findStoresById" and return matched values [storeId: 1111] ', function (done) {

storeModel.findStoresById(['1111'], function(err, store) {
assert.equal(store[0].storeId, '1111');
assert.equal(store[0].storeName, 'StoreName');
assert.equal(err, null);
done();
});

});

但是当我在一个单独的函数中实现以下代码时出现问题:

get: function (req, res) {

if (req.query.storeIds) {

var ids = req.query.storeIds.split(',');

storeModel.findStoresById(ids, function(err, stores) {
if (err) {
return res.send(err);
}

if (_.isEmpty(stores)) {
var error = {
message: "No Results",
errorKey: "XXXX"
}
return res.status(404).json(error);
}
return res.json(stores);
}); ...

我如何对此进行单元测试,我不想模拟它,因为“findStoreById”中的功能需要测试,或者是否需要重构?有什么建议吗?

最佳答案

我认为你实际上应该 stub findStoreById 因为不这样做 get 不能严格地进行单元测试,因为它不是孤立的并且可能会失败自己的错。鉴于您要测试的功能位于 findStoreById 的回调中而不是方法本身,我们可以愉快地 stub 它并使用 sinon 的 yields 方法来调用相应的回调。

请注意,如果您要测试路由,最好使用 supertest否则你手上会有很多请求和响应方法的模拟。因此,例如:

var request = require('supertest');
var express = require('express');
// stub database method
sinon.stub(storeModel, 'findStoresById');

// create a test app/route to which we direct test requests
var app = express();
app.get('/', myRouteFunction);

it('sends a 404 error when no stores are found', function(done) {
// use the second argument of `yields` to pass a result to the callback
storeModel.findStoresById.yields(null, []);
request(app).get('/').expect(404, done);
});

it('responds with any stores found', function(done) {
// pass an array of found stores to the callback
storeModel.findStoresById.yields(null, [{_id: 1}]);
request(app).get('/').end(function(err, res) {
if(err) return done(err);

assert.deepEqual(res.body, [{_id: 1}]);
done();
});
});

关于node.js - 带有 Mongoose 调用的 Mocha 测试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28097999/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com