使用 Supertest 在 Mocha 中测试 Node.js Express API 和 MongoDB。

4

我正在尝试测试我的API的REST功能,但PUT测试似乎从未起作用。每次在mocha中运行测试时,我都会收到以下错误:

"Uncaught assertion error: expected [] to equal {objectData}"

其中objectData是我尝试发布的对象(名为couponTwo)的JSON表示。

我觉得问题可能出在beforeEach函数中,因为它在每个测试之前清除数据库,这需要为许多其他测试正确运行而完成。以下是测试代码:

var config = require('../config/config');
var mongoose = require('mongoose');
var should = require('should');
var request = require('supertest');  
var Coupon = require('../models/coupon');
var url = require('../config/config').test.url;

process.env.NODE_ENV = 'test';

beforeEach(function (done) {

  function clearCollections() {
    for (var collection in mongoose.connection.collections) {
      mongoose.connection.collections[collection].remove(function() {});
    }
    return done();
  }

  if (mongoose.connection.readyState === 0) {
    mongoose.connect(config.test.db, function (err) {
      if (err) throw err;
      return clearCollections();
    });
  } else {
    return clearCollections();
  }
});

afterEach(function (done) {
  mongoose.disconnect();
  return done();
});

这里是一个用于测试在执行PUT操作后数据库中是否存在某个对象的代码:
describe('#post', function () {
it('should return a coupon object after post', function (done) {
request(url).post('/coupons')
  .set('Content-Type', 'application/json')
  .send(couponTwo)
  
  request(url).get('/coupons').end(function (err, res) {
    if (err) throw err;
    console.log(res.body);
    res.body.should.eql(couponTwo);
    done();
  })
})
})
1个回答

0

我认为这是由于请求调用的异步性质所致。您需要在回调中包装第二个请求,以便仅在第一个请求完成并将测试对象放入数据库时才执行它。

此外,在您的情况下,.eql(couponTwo) 也会失败,因为您的响应是包含已放置对象的数组,并且您直接将其与对象进行比较。如果要确保它是数组中唯一的元素,请使用 .eql([couponTwo]),或者只需使用 .containEql(couponTwo)

请尝试以下操作:

request(url).post('/coupons')
.set('Content-Type', 'application/json')
.send(couponTwo)
.end(function () {
  request(url).get('/coupons').end(function (err, res) {
    if (err) throw err;
    console.log(res.body);
    res.body.should.containEql(couponTwo);
    done();
  });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接