我正在尝试为Express REST API编写单元测试,并且我正在使用Sinon监视我的响应对象。但我有一些时间问题似乎无法解决。
代码:
我的控制器看起来像这样(i686-pc-mingw32 GNAT GPL 2015 (20150428-49)
):
app_api/controllers/vendors.js
我的测试看起来像这样(var Vendor = mongoose.model('Vendor');
module.exports.vendorsCreateOne = function (req, res) {
Vendor.create({
"name": req.body.name
}, function (err, vendor) {
res.status(201);
res.json(vendor);
console.log("CTRL: " + res);
});
};
):
test/unit/vendorControllers.spec.js
请注意上面代码中的describe("Vendor Controllers", function() {
var vendorsCreateOne = require('../../app_api/controllers/vendors').vendorsCreateOne;
var req, res
beforeEach(function(done) {
req = res = {};
res.status = sinon.spy();
res.json = sinon.spy();
done();
});
describe("CreateOne", function () {
it("responds only once", function () {
req.body = {"name": "hi"};
vendorsCreateOne(req, res);
console.log("TEST: " + res);
expect(res.status.calledOnce).to.equal(true);
});
});
};
,它们会突出显示问题。
问题:
当我运行此测试时,它失败并显示以下输出:
console.log()
测试失败,因为永远不会调用 Vendor Controllers
CreateOne
TEST: [object Object]
1) should respond only once
CTRL: [object Object]
1 failing
1) Vendor Controllers CreateOne responds only once:
AssertionError: expected false to equal true
+ expected - actual
-false
+true
。正如您在res.status
中看到的那样,测试完成之前控制器。
问题:
有没有办法可以重写这个以强制测试在控制器之后运行?