2017-10-25 1 views
0

이 문제로 고생하고 있습니다. 기대치와 새로운 버전으로 로그인 API를 테스트하려고하는데 예상치 못한 오류가 발생합니다. 그건 내 테스트 코드입니다. 새로운 버전을 기대하면서 toInclude() 어설 션의 완벽한 대체품은 무엇입니까?

it('should login user and return auth token', (done) => { 
 
     request(app) 
 
     .post('/users/login') 
 
     .send({ 
 
      email : users[1].email, 
 
      password : users[1].password 
 
     }) 
 
     .expect((res) => { 
 
      expect(res.headers['x-auth']).toBeTruthy(); 
 
     }) 
 
     .end((error,res) => { 
 
      if(error) 
 
      { 
 
       return done(error); 
 
      } 
 
      User.findById(users[1]._id).then((user) => { 
 
       expect(user.tokens[0]).toMatchObject({ 
 
        access : 'auth', 
 
        token : res.headers['x-auth'] 
 
       }); 
 
       done(); 
 
      }).catch((error) => done(error)); 
 
     }); 
 
     
 
    });

그리고 오류

1) POST /users/login 
 
     should login user and return auth token: 
 
    Error: expect(received).toMatchObject(expected) 
 

 
Expected value to match object: 
 
    {"access": "auth", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OWYwMzM0ZGExMzRmYjFmNzg4NTkzOTciLCJhY2Nlc3MiOiJhdX 
 
RoIiwiaWF0IjoxNTA4OTE0MDEzfQ.S0KCmLADcCLPWTK1khxNPO03tVMTW0HU117xapm56MM"} 
 
Received: 
 
    {"_id": "59f0335da134fb1f788593b3", "access": "auth", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OWYwMzM0ZGExMzR 
 
mYjFmNzg4NTkzOTciLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTA4OTE0MDEzfQ.S0KCmLADcCLPWTK1khxNPO03tVMTW0HU117xapm56MM"} 
 
Difference: 
 
- Expected 
 
+ Received 
 

 
    Object { 
 
+ "_id": "59f0335da134fb1f788593b3", 
 
    "access": "auth", 
 
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OWYwMzM0ZGExMzRmYjFmNzg4NTkzOTciLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTA 
 
4OTE0MDEzfQ.S0KCmLADcCLPWTK1khxNPO03tVMTW0HU117xapm56MM", 
 
    }

나는 두 가지를 테스트하고 있지만, 코드 자체가 _id를 포함하고 나에게 그 오류를 보이고있다. 이전 버전의 expect (Jest가 도입되지 않은 경우)에서는 toInclude() 단언을 사용하는 것이 간단했지만 이제는 toContain()과 toMatchObject()가 동일한 오류를 표시합니다.

내 시드 파일

const{ObjectID} = require('mongodb'); 
 
const jwt = require('jsonwebtoken'); 
 
const {Todo} = require('./../../models/todo'); 
 
const {User} = require('./../../models/user'); 
 

 
const userOneId = new ObjectID(); 
 
const userTwoId = new ObjectID(); 
 
const users = [{ 
 
    _id: userOneId, 
 
    email: '[email protected]', 
 
    password : 'userOnePass', 
 
    tokens: [{ 
 
     access : 'auth', 
 
     token : jwt.sign({_id : userOneId,access : 'auth'}, 'abc123').toString() 
 
    }] 
 

 
}, 
 
{ 
 
    _id: userTwoId, 
 
    email: '[email protected]', 
 
    password : 'userTwoPass', 
 
    // tokens: [{ 
 
    //  access : 'auth', 
 
    //  token : jwt.sign({_id : userTwoId,access : 'auth'}, 'abc123').toString() 
 
    // }] 
 

 

 
}];

+1

새 개체 ID가 생성 될 때마다 u 개체 전체를 일치시킬 수 없습니다. 'toMatchObject' 대신에 왜 응답을 받으면'access'와'token'을 개별적으로 확인하지 않습니까? – kgangadhar

답변

-1

배열로 개체를 변환 있다고.

[{"access": "auth"}, {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OWYwMzM0ZGExMzRmYjFmNzg4NTkzOTciLCJhY2Nlc3MiOiJhdX 
RoIiwiaWF0IjoxNTA4OTE0MDEzfQ.S0KCmLADcCLPWTK1khxNPO03tVMTW0HU117xapm56MM"}] 

를 담아 로 변경

{"access": "auth", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OWYwMzM0ZGExMzRmYjFmNzg4NTkzOTciLCJhY2Nlc3MiOiJhdX 
RoIiwiaWF0IjoxNTA4OTE0MDEzfQ.S0KCmLADcCLPWTK1khxNPO03tVMTW0HU117xapm56MM"} 

()이 입력되지 않은 객체와 배열을 기대하고있다. 객체를 객체 배열로 변환하십시오.

0

약간의 변경 만하면됩니다. 대신에 사용하는

expect(user.tokens[0]).toMatchObject({ 
    access : 'auth', 
    token : res.headers['x-auth'] 
}); 

왜이

expect(user.toObject().tokens[0]).toMatchObject({ 
    access : 'auth', 
    token : res.headers['x-auth'] 
}); 

같은 user.toObject() 포함되어 있습니까? user은 예상보다 많은 정보를 가진 몽구스 개체입니다. token에 여분의 _id 속성이 있음을 알 수 있습니다 (던져진 오류는이를 보여줍니다). 무엇 toObject() 않습니다 (예 : _id, __v 등) 모든 몽구스 특정 속성없이 예상대로 개체를 반환합니다.

관련 문제