Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用supertest和co在请求后验证数据库内容_Node.js_Supertest_Monk_Co - Fatal编程技术网

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

Node.js 使用supertest和co在请求后验证数据库内容,node.js,supertest,monk,co,Node.js,Supertest,Monk,Co,我想写一个测试来更新一篇博客文章(或其他内容): *在数据库中插入博客文章 *获取博客文章在MongoDb中获得的id *将更新版本发布到我的端点 *请求完成后:在数据库中签入更新已完成 下面是这个,使用: 我意识到里面有很多运动部件,但我已经分别测试了所有的交互。下面是我包含的db文件(我知道它工作得很好,因为我在生产中使用它): 生产代码按预期工作。 这个测试通过了,但在我看来,好像.end()-子句中的co函数从未运行过。。。但是会进行done()调用。至少没有打印“CHECKED DB”

我想写一个测试来更新一篇博客文章(或其他内容): *在数据库中插入博客文章 *获取博客文章在MongoDb中获得的id *将更新版本发布到我的端点 *请求完成后:在数据库中签入更新已完成

下面是这个,使用:

我意识到里面有很多运动部件,但我已经分别测试了所有的交互。下面是我包含的db文件(我知道它工作得很好,因为我在生产中使用它):

生产代码按预期工作。 这个测试通过了,但在我看来,好像.end()-子句中的co函数从未运行过。。。但是会进行done()调用。至少没有打印“CHECKED DB”

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

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

这是因为

 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。。。(见:)。