【问题标题】:Mocha testing: Why am I getting null as the user?摩卡测试:为什么我作为用户得到空值?
【发布时间】:2018-10-06 21:54:32
【问题描述】:

所以我已经放置了这个测试套件。不幸的是,我没有先见之明来测试我从数据库中返回的用户是 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'?

【问题讨论】:

    标签: mongodb mongoose mocha.js mongoose-schema


    【解决方案1】:

    您需要在 populate 之后使用 exec() 才能获得实际的承诺:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2016-09-26
      相关资源
      最近更新 更多