3

我已经在这个网站和网络上搜索了一段时间,但我找不到解决这个问题的方法。我正在尝试测试我的 API 的 REST 功能,但 PUT 测试似乎从来没有工作过。每次在 mocha 中运行测试时,我都会收到错误“未捕获的断言错误:预期 [] 等于 {objectData}”,其中 objectData 是我尝试发布的对象的 json 表示形式(名为 couponTwo)。

我感觉问题出在 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();
  })
})
})

如果这个问题的答案很明显并且我错过了一些基本的东西,我深表歉意,但我遇到了障碍。谢谢你的帮助!

4

1 回答 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();
  });
});
于 2014-05-06T09:02:24.440 回答