我如何在我的node.js应用程序中模拟出数据库,在这种情况下,它mongodb用作博客REST API的后端?
当然,我可以将数据库设置为特定的testing数据库,但我仍然会保存数据而不是仅测试我的代码,还有数据库,所以我实际上没有进行单元测试而是集成测试.
那应该怎么做?创建数据库包装器作为应用程序和数据库之间的中间层,并在测试时替换DAL?
// app.js
var express = require('express');
app = express(),
mongo = require('mongoskin'),
db = mongo.db('localhost:27017/test?auto_reconnect');
app.get('/posts/:slug', function(req, res){
db.collection('posts').findOne({slug: req.params.slug}, function (err, post) {
res.send(JSON.stringify(post), 200);
});
});
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)
// test.js
r = require('requestah')(3000);
describe("Does some testing", function() {
it("Fetches a blogpost by slug", function(done) {
r.get("/posts/aslug", function(res) {
expect(res.statusCode).to.equal(200);
expect(JSON.parse(res.body)["title"]).to.not.equal(null);
return done();
});
});
));
Run Code Online (Sandbox Code Playgroud) 我想创建一个猫鼬存根save在特定模型的方法,让我创造我的模型的任何实例将调用存根而不是正常的猫鼬的save方法.我的理解是,这样做的唯一方法是将整个模型存根如下:
var stub = sinon.stub(myModel.prototype);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这行代码导致我的测试抛出以下错误:
TypeError: Cannot read property 'states' of undefined
Run Code Online (Sandbox Code Playgroud)
有谁知道这里出了什么问题?
我正在尝试使用Mongoose模型测试我用来保存小部件的服务功能.我想在我的模型上存根保存实例方法,但我无法找到一个好的解决方案.我见过其他建议,但似乎都没有完整.
这是我的模特......
// widget.js
var mongoose = require('mongoose');
var widgetSchema = mongoose.Schema({
title: {type: String, default: ''}
});
var Widget = mongoose.model('Widget', widgetSchema);
module.exports = Widget;
Run Code Online (Sandbox Code Playgroud)
这是我的服务......
// widgetservice.js
var Widget = require('./widget.js');
var createWidget = function(data, callback) {
var widget = new Widget(data);
widget.save(function(err, doc) {
callback(err, doc);
});
};
Run Code Online (Sandbox Code Playgroud)
我的服务很简单.它接受一些JSON数据,创建一个新的小部件,然后使用"save"实例方法保存小部件.然后它根据保存调用的结果回调传递错误和doc.
当我调用createWidget时,我只想测试它({title:'Widget A'})...
为了单独测试这个,我可能需要......
我无法弄清楚如何用Sinon做到这一点.我已经尝试过在SO页面上找到的几个变种而没有运气.
笔记:
感谢您的任何帮助,您可以提供.
我已经在Stack Overflow上阅读了以下帖子:
我也研究过mockgoose,但我更喜欢使用testdouble或sinon来存根/模拟我的数据库调用.
这里找到的信息可能与我想做的最接近.但我无法完全理解它.我认为,不同之处在于我试图在我的api中测试路线,而不是直接测试Mongoose模型.这是我的代码:
server.ts
import * as express from 'express';
const app = express()
import { createServer } from 'http';
const server = createServer(app);
import * as ioModule from 'socket.io';
const io = ioModule(server);
import * as path from 'path';
import * as bodyParser from 'body-parser';
import * as helmet from 'helmet';
import * as compression from 'compression';
import * as morgan from 'morgan';
// Database connection
import './server/db';
// Get our API routes and socket …Run Code Online (Sandbox Code Playgroud) node.js ×4
mongoose ×3
unit-testing ×3
mocking ×2
sinon ×2
database ×1
express ×1
javascript ×1
mongodb ×1