摩卡测试:为什么我作为用户得到空值?
Mocha testing: Why am I getting null as the user?
所以我放了这个测试套件。不幸的是,我没有先见之明来测试我从数据库中返回的用户是 joe 而我没有,因为我已经在这里进行了保存 'joe' 的测试,用户:
const assert = require('assert');
const User = require('../src/user');
describe('Creating records', () => {
it('saves a user', done => {
const joe = new User({ name: 'Joe' });
joe.save().then(() => {
// Has joe been saved successfully
assert(!joe.isNew);
done();
});
});
});
它正在过去。我继续创建这些测试:
const mongoose = require('mongoose');
const assert = require('assert');
const User = require('../src/user');
const Comment = require('../src/comment');
const BlogPost = require('../src/blogPost');
describe('Association', () => {
let joe, blogPost, comment;
beforeEach(done => {
joe = new User({ name: 'Joe' });
blogPost = new BlogPost({
title: 'Eloquent JavaScript',
content: 'As programs get bigger, they also become more complex'
});
comment = new Comment({ content: 'Love this post' });
joe.blogPosts.push(blogPost);
blogPost.comments.push(comment);
comment.user = joe;
Promise.all([joe.save(), blogPost.save(), comment.save()]).then(() =>
done()
);
});
it('saves a relation between a user and a blogpost', done => {
User.findOne({ name: 'Joe' })
.populate('blogPosts')
.then(user => {
assert(user.blogPosts[0].title === 'Eloquent JavaScript');
done();
});
});
他们通过了,但是当我在这里添加这个测试时:
xit('saves a full relation graph', () => {
User.findOne({ name: 'Joe' })
.populate({
path: 'blogPosts',
populate: {
path: 'comments',
model: 'comment',
populate: {
path: 'user',
model: 'user'
}
}
})
.then(user => {
assert(user.name === 'Joe');
assert(user.blogPosts[0].title === 'Eloquent JavaScript');
assert(
user.blogPosts[0].comments[0].content ===
'As programs get bigger, they also become more complex'
);
assert(user.blogPosts[0].comments[0].user.name === 'Joe');
done();
});
});
失败了。我控制台记录了它,发现对于用户我正在返回 null
并且我不清楚为什么我返回 null。所以这是我终端的输出:
{ _id: 5bb92e5fe6b40e97e21cd95f,
user: null,
content: 'Love this post',
__v: 0 }
当我通过控制台日志检查此测试是否成功时,如下所示:
it('saves a full relation graph', () => {
User.findOne({ name: 'Joe' })
.populate({
path: 'blogPosts',
populate: {
path: 'comments',
model: 'comment',
populate: {
path: 'user',
model: 'user'
}
}
})
.then(user => {
console.log(user.blogPosts[0].comments[0]);
done();
});
});
谁能看出我为什么得到 user: null
而不是 'Joe'?
您需要利用 exec() after your populate 来获得实际承诺:
xit('saves a full relation graph', () => {
User.findOne({ name: 'Joe' })
.populate({
path: 'blogPosts',
populate: {
path: 'comments',
model: 'comment',
populate: {
path: 'user',
model: 'user'
}
}
}).exec()
.then(user => {
assert(user.name === 'Joe');
assert(user.blogPosts[0].title === 'Eloquent JavaScript');
assert(
user.blogPosts[0].comments[0].content ===
'As programs get bigger, they also become more complex'
);
assert(user.blogPosts[0].comments[0].user.name === 'Joe');
done();
});
});
所以我放了这个测试套件。不幸的是,我没有先见之明来测试我从数据库中返回的用户是 joe 而我没有,因为我已经在这里进行了保存 'joe' 的测试,用户:
const assert = require('assert');
const User = require('../src/user');
describe('Creating records', () => {
it('saves a user', done => {
const joe = new User({ name: 'Joe' });
joe.save().then(() => {
// Has joe been saved successfully
assert(!joe.isNew);
done();
});
});
});
它正在过去。我继续创建这些测试:
const mongoose = require('mongoose');
const assert = require('assert');
const User = require('../src/user');
const Comment = require('../src/comment');
const BlogPost = require('../src/blogPost');
describe('Association', () => {
let joe, blogPost, comment;
beforeEach(done => {
joe = new User({ name: 'Joe' });
blogPost = new BlogPost({
title: 'Eloquent JavaScript',
content: 'As programs get bigger, they also become more complex'
});
comment = new Comment({ content: 'Love this post' });
joe.blogPosts.push(blogPost);
blogPost.comments.push(comment);
comment.user = joe;
Promise.all([joe.save(), blogPost.save(), comment.save()]).then(() =>
done()
);
});
it('saves a relation between a user and a blogpost', done => {
User.findOne({ name: 'Joe' })
.populate('blogPosts')
.then(user => {
assert(user.blogPosts[0].title === 'Eloquent JavaScript');
done();
});
});
他们通过了,但是当我在这里添加这个测试时:
xit('saves a full relation graph', () => {
User.findOne({ name: 'Joe' })
.populate({
path: 'blogPosts',
populate: {
path: 'comments',
model: 'comment',
populate: {
path: 'user',
model: 'user'
}
}
})
.then(user => {
assert(user.name === 'Joe');
assert(user.blogPosts[0].title === 'Eloquent JavaScript');
assert(
user.blogPosts[0].comments[0].content ===
'As programs get bigger, they also become more complex'
);
assert(user.blogPosts[0].comments[0].user.name === 'Joe');
done();
});
});
失败了。我控制台记录了它,发现对于用户我正在返回 null
并且我不清楚为什么我返回 null。所以这是我终端的输出:
{ _id: 5bb92e5fe6b40e97e21cd95f,
user: null,
content: 'Love this post',
__v: 0 }
当我通过控制台日志检查此测试是否成功时,如下所示:
it('saves a full relation graph', () => {
User.findOne({ name: 'Joe' })
.populate({
path: 'blogPosts',
populate: {
path: 'comments',
model: 'comment',
populate: {
path: 'user',
model: 'user'
}
}
})
.then(user => {
console.log(user.blogPosts[0].comments[0]);
done();
});
});
谁能看出我为什么得到 user: null
而不是 'Joe'?
您需要利用 exec() after your populate 来获得实际承诺:
xit('saves a full relation graph', () => {
User.findOne({ name: 'Joe' })
.populate({
path: 'blogPosts',
populate: {
path: 'comments',
model: 'comment',
populate: {
path: 'user',
model: 'user'
}
}
}).exec()
.then(user => {
assert(user.name === 'Joe');
assert(user.blogPosts[0].title === 'Eloquent JavaScript');
assert(
user.blogPosts[0].comments[0].content ===
'As programs get bigger, they also become more complex'
);
assert(user.blogPosts[0].comments[0].user.name === 'Joe');
done();
});
});