我想编写一个测试来更新博客文章(或其他): * 在数据库中插入博客文章 * 获取博客文章在 MongoDb 中获得的 ID * 将更新版本发布到我的端点 * 请求完成后:检查在已完成更新的数据库中
这是这个,使用koa:
var db = require('../lib/db.js');
describe('a test suite', function(){
it('updates an existing text', function (done) {
co(function * () {
var insertedPost = yield db.postCollection.insert({ title : "Title", content : "My awesome content"});
var id = insertedPost._id;
var url = "/post/" + id;
var updatedPost = { content : 'Awesomer content' };
request
.post(url)
.send(updatedTextData)
.expect(302)
.expect('location', url)
.end(function () {
co(function *() {
var p = yield db.postCollection.findById(id);
p.content.should.equal(updatedPost.content);
console.log("CHECKED DB");
})(done());
});
});
});
});
我意识到那里有很多活动部件,但我已经分别测试了所有交互。这是我包含的 db 文件(我知道它工作正常,因为我在生产中使用它):
var monk = require('monk');
var wrap = require('co-monk');
function getCollection(mongoUrl, collectionName) {
var db = monk(mongoUrl);
return wrap(db.get(collectionName));
};
module.exports.postCollection = getCollection([SECRET MONGO CONNECTION], 'posts');
生产代码按预期工作。这个测试通过了,但在我看来,就像 .end() 子句中的协同函数永远不会运行......但是 done() 调用被调用了。至少没有打印“CHECKED DB”。
我试过用“done()”和“done”没有。有时这有效,有时无效。我试图将数据库检查移到请求之外......但这只是挂起,因为 supertest 希望我们在完成时调用 done()。
所有这一切让我感到困惑和害怕(:)) - 我在这里做错了什么。