在期待新版本中,toInclude()断言的完美替代是什么?

时间:2017-10-25 07:03:29

标签: node.js mocha

坚持这一点。我正在尝试使用expect测试我的登录API,并期望新版本给我一些错误。 那是我的测试代码。

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: 'adil.aj95@gmail.com',
    password : 'userOnePass',
    tokens: [{
        access : 'auth',
        token : jwt.sign({_id : userOneId,access : 'auth'}, 'abc123').toString()
    }]

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


}];

2 个答案:

答案 0 :(得分:2)

你需要稍微改变一下。而不是使用

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

.toObject()之后加上user

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

为什么呢?您的user是一个猫鼬对象,其信息比您预期的多。您可以看到_id中有一个额外的token属性(抛出的错误显示了这一点)。 toObject()所做的只是按照您的预期返回对象,没有所有特定于猫鼬的属性(如_id__v等内容。)

答案 1 :(得分:0)

您可以通过jest将.toHaveProperty(keyPath, value)用于新的期望版本。

所以代码变成这样:

expect(user.tokens[0]).toHaveProperty('access', 'auth');
expect(user.tokens[0]).toHaveProperty('token', user.tokens[0].token);