2017-09-08 1 views
0

로그인 컨트롤러에 대한 테스트를 실행 중이며 프로그래밍 된대로 상태 코드가 200이 아닌 잘못된 상태 (401)를 유지합니다. 주어진 입력이 맞으면 사용자가 등록하고 반환 할 때 저장된 데이터를 사용할 것으로 기대합니다. 우편 배달부에서 완벽하게 작동하지만 테스트를 작성하는 중에 401 오류가 발생합니다. 이 오류 난입니다Javascript - 테스트 중에 잘못된 상태 코드 제공

signin(req, res) { 

    const username = req.body.username.toLowerCase().trim(); 
    // const email = req.body.email.trim(); 

    if(!username) { 
     return res.status(401) 
     .send(
     {status: false, 
      message: "Username cannot be empty" 
     }); 
    } 
    else if (!req.body.password) { 
     return res.status(401) 
     .send({ 
     status: false, 
     message: "Password field cannot be empty" 
     }); 
    } 
    return User.findOne({ 
     where: { 
     username, 
     } 
    }) 
    .then((user) =>{  

     if(!user) { 
     return res.status(401).send({message: "User is not registered"}) 
     } 
     else if(!user.validPassword(req.body.password)){ 
     return res.status(401) 
     .send({ 
      message: "The password is incorrect" 
     }) 
     } 
     const token = user.generateAuthToken(); 
     res.header('x-auth', token).status(200).send({ 
     statusCode: 200, 
     message: `Welcome back, ${user.username}`, 
     user 
    }); 
    }) 
    .catch(error => {return res.status(400).send(error)}) 
    }, 

:

it('it should signin a new user', (done) => { 
     request(app) 
     .post('/api/users/signin') 
     .send({ 
     username: "Charles",   
     password: "challenger",    
     }) 
     .expect(200) 
     .end((err, res) => { 
     if (err) { 
      return done(err); 
     }   

     done() 
     }); 
    }); 

이것은 로그인 내 컨트롤러 : 그것은이의 기호에 대한 테스트 블록 사용자

를 찾을 수없는 것과 같다 얻으십시오 :

1) Testing API routes POST /api/users/ it should signin a new user: 
    Error: expected 200 "OK", got 401 "Unauthorized" 
     at Test._assertStatus (node_modules\supertest\lib\test.js:266:12) 
     at Test._assertFunction (node_modules\supertest\lib\test.js:281:11) 
     at Test.assert (node_modules\supertest\lib\test.js:171:18) 
     at Server.assert (node_modules\supertest\lib\test.js:131:12) 
     at emitCloseNT (net.js:1552:8) 
     at _combinedTickCallback (internal/process/next_tick.js:77:11) 
     at process._tickCallback (internal/process/next_tick.js:104:9) 
+0

400은 마지막 then() 절의 어딘가에 javascript 오류가 발생합니다.끝에있는 catch 블록에서 "error"값을 출력 해보십시오. 그러면 실패한 것을 알 수 있습니다. –

+0

@DuncanThacker 죄송합니다. 401 오류가 아니고 400 오류가 발생합니다. 사용자는 우편 배달부에서 잘 로그인 할 수 있지만 내 테스트는 여전히 실패합니다. 사용자가 없으면 오류가 발생합니다. – letmebe

+1

401과 함께 보내는 메시지는 무엇입니까? 그러면 코드의 어느 부분이 잘못 될지 알 수 있습니다. –

답변

0

나는 엑서크를보기 위해 console.log()을 넣을 것입니다. 당신이 여기에 (401)

을 발사 4 가능성이 있기 때문에 당신이 검사에 대한 TLY 코드는 몇 가지 코드입니다 발사되는 :

// I don't understand enough context, so I have to re-write this 
// to show you how it could be an async function which will 
// return a promise, but will also allow you to await. 

// async function sign(req, res) { 
const sign = async (req, res) => { // This is same as above line 

    const username = req.body.username.toLowerCase().trim(); 
    // const email = req.body.email.trim(); 

    if (!username) { 
     console.log('username was empty') 
     return res.status(401).send({ 
      status: false, 
      message: "Username cannot be empty" 
     }); 
    } 

    if (!req.body.password) { 
     console.log('password was empty') 
     return res.status(401).send({ 
      status: false, 
      message: "Password field cannot be empty" 
     }); 
    } 

    return await User.findOne({ where: { username } }) 
     // I'm making this one async also to ensure user.generateAuthToken() 
     // has a value before it proceeds to res.send() 
     .then(async (user) => {  
      if (!user) { 
       console.log('couldnt find user') 
       return res.status(401).send({ 
        message: "User is not registered" 
       }) 
      } 

      else if (!user.validPassword(req.body.password)){ 
       console.log('password was incorrect') 
       return res.status(401).send({ 
        message: "The password is incorrect" 
       }) 
      } 

      const token = await user.generateAuthToken(); 
      // I added a return here 
      return res.header('x-auth', token).status(200).send({ 
       statusCode: 200, 
       message: `Welcome back, ${user.username}`, 
       user 
      }); 
     }) 
     .catch((error) => { 
      console.log('lets put data in here: ' + error) 
      return res.status(400).send(error) 
     }) 
}, 

나는 MongoDB를 검색 User.findOne({ where: { username } })을 알 수 있습니다. 나는 그것이 $where 일 필요가 있는지 기억할 수 없다. 나는 MongoDB 구문이 $를 사용한다고 생각한다. 그렇다면 문제가 될 수 있으며 그럴 경우 console.log('couldnt find user')을 발사합니다. 그건 네이티브 MongoDB 드라이버에만 해당 될 수 있습니다. 방금 봤 거든 그 구문은 또한 User.findOne({ username: username })의 약어 인 User.findOne({ username }) 일 수 있다는 것을 알게되었습니다.

어떤 사람들은 return await fn()을하고 await를 생략하는 중복 당신을 말할 것이다,하지만 약속이 거부되는 경우는 처리되지 않은 약속의 거부가 발생합니다. 기다리고 있다면 잡힐 것입니다. 이것은 상위 범위의 오류 처리 아키텍처의 일부입니다.

일부 비동기식/대기중인 튜토리얼을 보는 것이 좋습니다. 콜백 소스를 약간 섞어서 보았 기 때문입니다. 귀하의 코드는 꽤 좋지만, 다음 단계로 넘어갈 수 있다고 생각합니다. 준비가 된 것 같습니다. 당신의 if 문이 하나 개의 표현이있는 경우

재미있는 사실, 당신은 또한 {}를 생략 할 수 있습니다, 예 :

if (err) { 
    throw err; 
} 

는 속기가 될 수 있습니다

if (err) throw err; 

이가 먼 길을 갈 수 있습니다 코드를 정리하는 데 도움이되지만 throw과 함께 올바르게 사용되는 try/catch 블록을 사용하여 async/await 구문을 사용하면 최소한의 중첩으로 동기식 검색 코드를 크게 향상시킬 수 있습니다. 여기

나는 우리가 당신의 흐름 제어에 혼란을 추가 둥지를 제거하는 방법을 보여주고 싶은 때문에,이 중 일부를 다시 쓸 수있는 방법은 다음과 같습니다

const sign = async (req, res) => { 
    try { 
     const username = req.body.username.toLowerCase().trim() 
     if (!username) throw 'noUsername' 
     if (!req.body.password) throw 'noPassword' 

     const foundUser = await User.findOne({ username }) 
     if (!foundUser.username) throw 'notFound' 

     // I assume this returns Boolean 
     const validPassword = await user.validPassword(req.body.password) 
     if (!validPassword) throw 'invalidPassword' 

     // Alter generateAuthToken() to throw 'badToken' if it fails 
     const token = await user.generateAuthToken() 
     return res.header('x-auth', token).status(200).send({ 
      statusCode: 200, 
      message: `Welcome back, ${user.username}`, 
      user 
     }) 
    } catch (error) { 
     // errors are manually thrown into here, and rejected promises 
     // are automatically thrown into here 
     if (error === 'noUsername') return res.status(401).send({ 
      status: false, 
      message: 'Username cannot be empty' 
     }) 

     if (error === 'noPassword') return res.status(401).send({ 
      status: false, 
      message: 'Password field cannot be empty' 
     }) 

     if (error === 'notFound') return res.status(401).send({ 
      message: 'User is not registered' 
     }) 

     if (error === 'invalidPassword') return res.status(401).send({ 
      message: 'The password is incorrect' 
     }) 

     if (error === 'badToken') return res.status(403).send({ 
      message: 'User is not authorized' 
     }) 

     return res.status(400).send(error) 
    } 
} 

sign(req, res).then((response) => console.log(response)) 

희망이 도움이되었습니다 :) 미안 세미콜론을 사용하지 않습니다.

관련 문제