2017-09-25 116 views
1

我使用Mocha和Chai HTTP测试Rest API。我已经写的所有的使用回调测试的情况下,现在我想用异步/ AWAIT因为很多更具可读性谭回调和承诺,所以我得到这个代码:摩卡与Chai HTTP异步测试?

let sport1, sport2; 
let user1, user2; 
let user1Token; 
let event1, event2, event3, event4; 

beforeEach(async function() { 
    const preUser1 = test.createUser('[email protected]'); 
    const preUser2 = test.createUser('[email protected]') 

    sport1 = await Sport.create(test.createSport('Tenis')); 
    sport2 = await Sport.create(test.createSport('Baloncesto')); 
    user1 = await User.create(preUser1); 
    user2 = await User.create(preUser2); 
    event1 = await Event.create(test.createEventDb(user1._id, sport1._id)); 
    event2 = await Event.create(test.createEventDb(user1._id, sport2._id)); 
    event3 = await Event.create(test.createEventDb(user2._id, sport1._id)); 
    event4 = await Event.create(test.createEventDb(user2._id, sport2._id)); 

    await chai.request(app) 
    .post(`${apiPath}/sessions`) 
    .set('content-type', 'application/json') 
    .send({ email: preUser1.email, password: preUser1.password }) 
    .end(function (err, res) { 
     console.log(res.body) 
     user1Token = res.body.data.session.token; 
    }); 
}); 

的等待报表工作很好,但这里的问题是与柴。我得到这个错误:

1) Events "before each" hook for "should return 200, id and event info": 
TypeError: First argument must be a string or Buffer 
    at ClientRequest.end (_http_outgoing.js:605:11) 
    at Test.Request.end (node_modules/superagent/lib/node/index.js:873:9) 
    at node_modules/superagent/lib/request-base.js:72:12 
    at Test.then (node_modules/superagent/lib/request-base.js:71:31) 
    at process._tickCallback (internal/process/next_tick.js:109:7) 

但是,没有异步/ await调用这个错误不会引发。有什么想法发生了什么?谢谢。

+1

嗯,他们不会在柴HTTP诺言[示例]使用'.end'(http://chaijs.com/plugins/chai-http/)。相反,他们调用'.then'来得到回应。所以如果我理解了promise的例子吧:用异步/等待你将响应保存在一个变量中(而不是调用'.then'),然后调用'expect'(或者你喜欢的任何其他断言函数)。 – Rhayene

+0

的确如此,我没有注意到它们在使用promise时没有使用'.end()'方法。它完美地将响应保存在一个变量中,然后作出断言,谢谢! –

+1

随时回答你自己的问题:) – Rhayene

回答

0

正如@Rhayene提到的,要使用Chai的承诺,您不能使用.end()方法,这就是为什么我得到这个错误。相反,您只将响应存储在变量中,然后进行必要的断言。所以,我的重构的代码是这样的:

let sport1, sport2; 
let user1, user2; 
let user1Token; 
let event1, event2, event3, event4; 

beforeEach(async function() { 
    const preUser1 = test.createUser('[email protected]'); 
    const preUser2 = test.createUser('[email protected]') 

    sport1 = await Sport.create(test.createSport('Tenis')); 
    sport2 = await Sport.create(test.createSport('Baloncesto')); 
    user1 = await User.create(preUser1); 
    user2 = await User.create(preUser2); 
    event1 = await Event.create(test.createEventDb(user1._id, sport1._id)); 
    event2 = await Event.create(test.createEventDb(user1._id, sport2._id)); 
    event3 = await Event.create(test.createEventDb(user2._id, sport1._id)); 
    event4 = await Event.create(test.createEventDb(user2._id, sport2._id)); 

    const res = await chai.request(app) 
    .post(`${apiPath}/sessions`) 
    .set('content-type', 'application/json') 
    .send({ email: preUser1.email, password: preUser1.password }) 

    user1Token = res.body.data.session.token; 
});