相关疑难解决方法(0)

在node.js中模拟数据库?

我如何在我的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)

database unit-testing mocking mongodb node.js

70
推荐指数
5
解决办法
5万
查看次数

用Sinon对Mongoose模型进行挖掘

我想创建一个猫鼬存根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 node.js sinon

20
推荐指数
3
解决办法
1万
查看次数

用Sinon保存Mongoose模型的实例方法

我正在尝试使用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'})...

  • 使用传递给服务函数的数据调用Widget构造函数一次
  • 新创建的窗口小部件对象上的save实例方法被调用一次
  • EXTRA CREDIT:保存实例方法为错误调用null,为文档调用{title:'Widget A'}.

为了单独测试这个,我可能需要......

  • 模拟或存根Widget构造函数,以便它返回我作为测试的一部分创建的模拟小部件对象.
  • 存储模拟小部件对象的保存功能,以便我可以控制发生的事情.

我无法弄清楚如何用Sinon做到这一点.我已经尝试过在SO页面上找到的几个变种而没有运气.

笔记:

  • 我不想将已经构造的模型对象传递给服务,因为我希望服务是唯一"知道"mongoose的东西.
  • 我知道这不是最大的交易(只是通过更多的集成或端到端测试来测试它,但是找出解决方案会很好.

感谢您的任何帮助,您可以提供.

javascript unit-testing mongoose node.js sinon

10
推荐指数
1
解决办法
4519
查看次数

单元测试Express/Mongoose应用程序路由,无需访问数据库

我已经在Stack Overflow上阅读了以下帖子:

使用Mongoose进行单元测试

模拟/存根Mongoose模型保存方法

我也研究过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)

unit-testing mocking mongoose node.js express

5
推荐指数
1
解决办法
3276
查看次数