2017-09-25 5 views
1

저는 Mocha와 Chai HTTP를 사용하여 Rest API를 테스트하고 있습니다. 나는 콜백을 사용하여 테스트 케이스를 모두 쓰고했는데 지금은 더 많은 황갈색 콜백과 약속 읽을 수있는, 그래서이 코드를 얻을 수 있기 때문에 비동기/await를 사용하려면 :모카와 차이 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; 
    }); 
}); 

이 기다리고를 문 작업을 좋아,하지만 여기서 문제는 chai에있다. 이 오류가 나타납니다.

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) 

그러나이 오류는 async/await 호출 없이는 발생하지 않습니다. 무슨 일이 벌어지고 있는지에 대한 어떤 생각? 감사.

+1

흠, 그들은 차이 티 HTTP 약속 [예]에'.end'를 사용하지 않는 (http://chaijs.com/plugins/chai-http/). 대신 그들은 응답을 얻기 위해'.then '를 호출한다. 따라서 약속 예제를 올바르게 이해한다면 비동기/응답으로 변수를 응답에 저장하고 (예 :'.then ') 대신'expect '(또는 원하는 다른 어설 션 함수)를 호출 할 수 있습니다. – Rhayene

+0

사실입니다. 나는 그들이 약속을 사용할 때'.end()'메서드를 사용하지 않는다는 것을 알지 못했습니다. 그것은 완벽하게 변수의 응답을 저장하고, 어서션을 만드는 일을하고 있습니다, 감사합니다! –

+1

나만의 질문에 자유롭게 대답 해주세요 :) – Rhayene

답변

0

@Rhayene 언급했듯이, 당신은 .end() 방법을 사용할 수 없다는 약속과 함께 Chai를 사용하기 때문에 그 오류가 발생합니다. 따라서 대신 변수에 응답을 저장 한 다음 필요한 어설 션을 만듭니다. 그래서, 내 리팩토링 코드는 이것이다 :

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; 
});