【问题标题】:Express.js Mocha testing having issues connecting to test dbExpress.js Mocha 测试在连接到测试数据库时遇到问题
【发布时间】:2014-09-10 14:11:46
【问题描述】:

我正在尝试让我的测试套件在我的 express.js 应用程序中运行,但这是我的第一个 express.js 应用程序,也是我第一次使用 mocha,我不确定如何设置所有内容。

这是我的测试

should = require 'should'
assert = require 'assert'
expect = require 'expect'
request = require 'superagent'
mongoose = require 'mongoose'
config = require '../../config/config'


describe "POST", ->
  app = require('../../app')

  beforeEach (done)->
    mongoose.connect config.db, (err) ->
      if err
        console.log "Error! #{err}"

      done()

  describe '/users/:id/activities', ->
    it 'should return created document', (done) ->
      request(app).post('http://localhost:3000/users/1/activities').send(
        description: "hello world"
        tags: "foo, bar"
      ).set('Content-Type','application/json')
      .end (e, res) ->
        console.log(res.body.description)
        expect(res.body.description).should.equal('hello world')
        done()

我遇到的几个问题是...... 1)在测试套件中,它无法连接到我的测试数据库(在我的配置文件中); 2) 我在尝试post 时收到此错误消息

1) POST /users/:id/activities should return created document:
     TypeError: Object #<Request> has no method 'post'

有人可以为我指出如何让一切正常运行的正确方向吗?

我尝试连接到 MongoDB 时返回的错误是 Error! Error: Trying to open unclosed connection.

我通过运行这个命令来运行 mocha 套件

NODE_ENV=test mocha test/controllers/activities.test.coffee --compilers coffee:coffee-script/register -R spec

编辑

activities.coffee(路线)

express  = require 'express'
router = express.Router()
mongoose = require 'mongoose'
Activity  = mongoose.model 'Activity'

module.exports = (app) ->
  app.use '/', router

router.post '/users/:id/activities', (req, res, next) ->
  activity = Activity(
    user_id: req.params.id
    description: req.body.description,
    tags: req.body.tags
  )

  activity.save (err)->
    if not err
      res.json(activity)
    else
      res.json({ error: err })

router.get '/users/:id/activities/:activity_id', (req, res, next) ->
  Activity.findById req.params.activity_id, (err, activity) ->
    if not err
      res.json(activity)
    else
      res.json({ error: err })

app.js

require('coffee-script/register');

var express = require('express'),
  config = require('./config/config'),
  fs = require('fs'),
  mongoose = require('mongoose');

mongoose.connect(config.db);
var db = mongoose.connection;
db.on('error', function () {
  throw new Error('unable to connect to database at ' + config.db);
});

var modelsPath = __dirname + '/app/models';
fs.readdirSync(modelsPath).forEach(function (file) {
  if (/\.coffee$/.test(file)) {
    require(modelsPath + '/' + file);
  }
});
var app = express();

require('./config/express')(app, config);

app.listen(config.port);

exports.app = app;

【问题讨论】:

    标签: node.js mongodb express mocha.js


    【解决方案1】:

    首先,一旦你的 superagent 指向你的 app 变量来保存你的路由、中间件等,就不需要在 superagent 提供的方法中指定 url。你只需要提供路线,就像这样:

    request(app)
      .post('/users/123/activities')
      .end(function (err, response) {
      });
    

    其次,使用 mocha 提供的 before 语句而不是 beforeEach,第二个语句将在您进行的每个单元测试中尝试连接到 mongo。

    对于第一个错误

    request has no method 'post'
    

    确保您已经安装了 superagent,并且您可以在您的 node_modules 文件夹中找到它。

    希望有帮助!

    【讨论】:

    • 谢谢!我要试一试
    • 我能够在我的应用程序中找到superagent 模块。让我粘贴我要测试的路线
    • 就是这样,您正在从规范代码以及为您的路线提供服务的 app.js 连接到 mongo。您不需要在测试中连接到 mongo。
    • 啊,明白了!好吧,mongo 错误消失了(自然而然),但现在我得到了1) POST /users/:id/activities should return created document: Uncaught AssertionError: expected { actual: 'hello world' } to be 'hello world' 如果在我的 res.body.description 的 console.log 中,我可以看到 hello world 返回了
    • 你试图使用所有可用的断言模块,这是一个错误,你只需要使用一个。更多信息mocha websiteshould = require 'should'assert = require 'assert'expect = require 'expect'选择你最喜欢的一个并根据他们的框架做断言,摩卡网站有一个链接到所有这些。
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 2016-05-02
    • 2018-10-01
    • 2018-08-21
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多