Node.js 使用supertest和co在请求后验证数据库内容
我想写一个测试来更新一篇博客文章(或其他内容): *在数据库中插入博客文章 *获取博客文章在MongoDb中获得的id *将更新版本发布到我的端点 *请求完成后:在数据库中签入更新已完成 下面是这个,使用: 我意识到里面有很多运动部件,但我已经分别测试了所有的交互。下面是我包含的db文件(我知道它工作得很好,因为我在生产中使用它): 生产代码按预期工作。 这个测试通过了,但在我看来,好像.end()-子句中的co函数从未运行过。。。但是会进行done()调用。至少没有打印“CHECKED DB” 我试过使用“done()”和不使用“done”。有时有效,有时无效。 我已尝试将数据库检查移到请求之外。。。但这只是挂起,因为supertest希望我们在完成时调用done() 所有这些都让我感到困惑和恐惧(:)-我在这里做错了什么。这是因为Node.js 使用supertest和co在请求后验证数据库内容,node.js,supertest,monk,co,Node.js,Supertest,Monk,Co,我想写一个测试来更新一篇博客文章(或其他内容): *在数据库中插入博客文章 *获取博客文章在MongoDb中获得的id *将更新版本发布到我的端点 *请求完成后:在数据库中签入更新已完成 下面是这个,使用: 我意识到里面有很多运动部件,但我已经分别测试了所有的交互。下面是我包含的db文件(我知道它工作得很好,因为我在生产中使用它): 生产代码按预期工作。 这个测试通过了,但在我看来,好像.end()-子句中的co函数从未运行过。。。但是会进行done()调用。至少没有打印“CHECKED DB”
var p = yield db.postCollection.findById(id);
是将在生成器函数中执行的最后一行
您可以通过添加console.log('beforefirstyield')来测试我是否正确
yield是生成器函数中return的替换,但是如果您再次调用该函数,它将运行到下一个yield
从一个产量到另一个产量执行生成器函数
(我认为用最短的方式来解释它是最好的方式)
您的解决方案:
在数据库查找之前简单擦除产量:
var p = db.postCollection.findById(id);
这是因为
var p = yield db.postCollection.findById(id);
是将在生成器函数中执行的最后一行
您可以通过添加console.log('beforefirstyield')来测试我是否正确
yield是生成器函数中return的替换,但是如果您再次调用该函数,它将运行到下一个yield
从一个产量到另一个产量执行生成器函数
(我认为用最短的方式来解释它是最好的方式)
您的解决方案:
在数据库查找之前简单擦除产量:
var p = db.postCollection.findById(id);
意识到这个问题很长,很曲折,很具体,我担心我永远不会得到一个正确的答案。因为这个问题问得不好 但给出的答案和评论让我再次审视,我发现了它。我写了一篇文章,但我会把它的结尾作为一个总结。如果没有意义,在博客帖子中还有更多相同的:) 这是TL;博士: 我想在执行请求后检查数据库的状态。这可以使用的.end()函数来完成 因为我使用了,所以我希望能够使用产量和发电机来实现这一点。这意味着我需要将生成器函数包装为 从版本4.0.0开始,co返回一个承诺。这非常适合的用户,因为它允许我们使用.then()函数并将done变量传递给.then的success和failure函数(fn success,fn failure(err)) 整个测试如下图所示。运行此命令将返回由于断言失败而导致的错误,如我所愿:
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);
});
});
});
意识到这个问题很长,很曲折,很具体,我担心我永远不会得到一个正确的答案。因为这个问题问得不好 但给出的答案和评论让我再次审视,我发现了它。我写了一篇文章,但我会把它的结尾作为一个总结。如果没有意义,在博客帖子中还有更多相同的:) 这是TL;博士: 我想在执行请求后检查数据库的状态。这可以使用的.end()函数来完成 因为我使用了,所以我希望能够使用产量和发电机来实现这一点。这意味着我需要将生成器函数包装为 从版本4.0.0开始,co返回一个承诺。这非常适合的用户,因为它允许我们使用.then()函数并将done变量传递给.then的success和failure函数(fn success,fn failure(err)) 整个测试如下图所示。运行此命令将返回由于断言失败而导致的错误,如我所愿:
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);
});
});
});
在这种情况下,成品率的问题是:生成器只调用一次。您可以找到的示例是,在一个成品率之后,您可以看到代码正在运行,通常是在一行中间件中,最后是在一个循环中运行。。。。但我也对此感到困惑:-)但我认为答案和评论会帮助你找到自己的路。嗯。。。我必须使用“收益率”,因为这就是我的db访问的工作方式。但是屈服于屈服。。。如果我创建了一个只从Mongo返回文档的小函数呢?我试试看,然后回击你。谢谢你的困惑-我以为我疯了,因为我的理解是基于什么方式,第二次进入发电机是必要的。如果db findById是生成器,那么可以使用yield*db。。。(见:)。只要我理解-如果我因为某些原因错了,也请告诉我。嗨,我的问题就是。。。使用产量。但我想用收益率。产量好。所以我不得不做更多的研究。在下面写了一个答案。感谢您的输入-帮助我解决了一个问题在这种情况下,产量的问题是:发电机只调用一次。您可以找到的示例是,在一个成品率之后,您可以看到代码正在运行,通常是在一行中间件中,最后是在一个循环中运行。。。。但我也对此感到困惑:-)但我认为答案和评论会帮助你找到自己的路。嗯。。。我必须使用“收益率”,因为这就是我的db访问的工作方式。但是屈服于屈服。。。如果我创建了一个只从Mongo返回文档的小函数呢?我试试看,然后回击你。谢谢你的困惑-我以为我疯了,因为我的理解是基于什么方式,第二次进入发电机是必要的。如果db findById是生成器,那么可以使用yield*db。。。(见:)。