gpt4 book ai didi

node.js - 使用 supertest 和 co 在请求后验证数据库内容

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:04 24 4
gpt4 key购买 nike

我想编写一个测试来更新博客文章(或其他内容):* 在数据库中插入博客文章* 获取博客文章在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());
});
});
});
});

我意识到其中有很多移动部件,但我已经单独测试了所有交互。这是我包含的数据库文件(我知道它工作正常,因为我在生产中使用它):

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() 子句中的协同函数永远不会运行……但是会调用 did() 。至少没有打印“CHECKED DB”。

我尝试过使用“done()”和“done”而不使用。有时这有效,有时则无效。我试图将数据库的检查移到请求之外......但这只是挂起,因为 super 测试希望我们在完成时调用done()。

所有这些都让我感到困惑和害怕 (:)) - 我在这里做错了什么。

最佳答案

意识到这个问题非常冗长且具体,我担心我永远不会得到正确的答案。由于问题问得不好。

但是给出的答案和评论让我又看了一遍,我找到了。我写了一个long blog post about it但我将在这里给出它的结尾作为总结。如果它没有意义,博客文章中还有更多相同的内容:)。

这是 TL;DR:

我想在发出请求后检查数据库的状态。这可以使用 supertest 的 .end() 函数来完成。 .

自从我使用 co-monk我希望能够使用产量和生成器来做到这一点。这意味着我需要用 co 包装我的生成器函数。 .

co,从4.0.0版本开始,返回一个promise。这非常适合mocha的用户因为它允许我们使用 .then() 函数并将 did 变量传递给 .then(fn success, fn failure(err)) 的 success 和 failure 函数。

完整的测试如下所示。运行此命令会由于断言失败而返回错误,如我所愿:

var co = require("co");
var should = require("should");
var helpers = require('./testHelpers.js');
var users = helpers.users;
var request = helpers.request;

describe('POST to /user', function(){

var test_user = {};

beforeEach(function (done) {
test_user = helpers.test_user;
helpers.removeAll(done);
});

afterEach(function (done) {
helpers.removeAll(done);
});

it('creates a new user for complete posted data', function(done){
// Post
request
.post('/user')
.send(test_user)
.expect('location', /^\/user\/[0-9a-fA-F]{24}$/) // Mongo Object Id /user/234234523562512512
.expect(201)
.end(function () {
co(function *() {
var userFromDb = yield users.findOne({ name : test_user.name });
userFromDb.name.should.equal("This is not the name you are looking for");
}).then(done, done);
});
});
});

关于node.js - 使用 supertest 和 co 在请求后验证数据库内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29692370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com