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()
});
});
问题是,hasAccess 在 users 被赋值之前被传递到 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);
});
所以我在使用 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()
});
});
问题是,hasAccess 在 users 被赋值之前被传递到 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);
});