Mocha:使用它 - 每个都带有因变量

Mocha: using it-each with dependent variables

所以我在使用 it-each 模块进行 mocha 循环测试时遇到了一些问题。我正在使用 supertest、should 和 it-each 模块。

var hasAccess = [{endpoint: "announcements", send: {"creator": users}}]

users 是我在这个测试中分配的变量

it('users', function(done) {
        api.get('/users')
        .set('Accept', 'application/json')
        .set('Authorization', devToken)
        .expect(200)
        .expect('Content-Type', /json/)
        .end(function(err, res) {
            if (err) return done(err)
            res.body[0].should.have.property('id')
            users = res.body[0].id                //<----------
            done()
        });
    });

我的每一个

it.each(hasAccess, 'should return 201 perfoming a POST on %s', ['endpoint'], function(element, next) {

   console.log(element.send) //prints out "creator": undefined

   api.post('/' + element.endpoint)
        .set('Accept', 'application/json')
        .set('Authorization', userToken)
        .expect('Content-Type', /json/)
        .send(element.send)
        .expect(201)
        .end(function(err, res) {
            if (err) return next(err)
            res.status.should.equal(201)
            next()
        });
});

问题是,hasAccessusers 被赋值之前被传递到 it-each。我知道让测试相互依赖是不好的做法,但实际上并没有另一种方法来测试它。我需要 id 来完全测试它。那么有什么想法吗? hasAccess中也会有更多的对象,所以循环是最好的方法。只是为此缩短了它。

你真的不应该让测试相互依赖,但如果你必须...

问题不在于 it.each,而在于您如何存储在第一次测试中获得的用户 ID。您可以这样创建数组:

var hasAccess = [{endpoint: "announcements", send: {"creator": users}}]

这从 users 中获取 hasAccess[0].send.creator 字段的值。那时它是 undefined,因此该字段获得值 undefined从现在开始,您对 users 所做的更改不会 影响存储在 hasAccess 中的值。 如果users 是一个对象,然后 hasAccess 将引用该对象并且修改该对象将反映在 hasAccess 中,但它是一个原始值:undefined。因此,对 users 的进一步更改在这里无效。

为了继续进行更改,您的第一个测试可以通过 hasAccess 数组到达现场。

这是如何完成的说明。我用 setTimeout:

模拟了异步进程
require("it-each")();
var assert = require("assert");

var users;
var hasAccess = [{endpoint: "announcements", send: {"creator": users}}];

it("get users", function (done) {
    setTimeout(function () {
        // Wrong way:
        // users = "foo";

        // Right way:
        hasAccess[0].send.creator = "foo";
        done();
    }, 1000);
});


it.each(hasAccess, 'should return 201 perfoming a POST on %s', ['endpoint'],
        function(element, next) {
            setTimeout(function () {
                assert(element.send.creator === "foo");
                // console.log(element);
                next();
            }, 1000);
        });