【问题标题】:Add test data for mocha test using before()使用 before() 为 mocha 测试添加测试数据
【发布时间】:2019-04-08 06:16:18
【问题描述】:

我正在尝试为我的测试添加测试数据:

const chai = require("chai");
const expect = require("chai").expect;

chai.use(require("chai-http"));

const app = require("../server.js"); // Our app
const user = require("../app/controllers/user.controller.js");
describe("API endpoint /users", function() {
    this.timeout(5000); // How long to wait for a response (ms)

    before(function() {

        const users = [
            {
                email: "ssss@ss.com",
                givenName: "eee",
                familyName: "www2"
            },
            {
                email: "ssss@ss.com",
                givenName: "eee",
                familyName: "www2"
            }
        ];
        user.create(users);
        done();
    });

    // GET - List all data
    it("should return all users", function() {
        return chai.request(app).get("/users").then(function(res) {
            expect(res).to.have.status(200);
            expect(res).to.be.json;
            expect(res.body).to.be.an("array");
        });
    });
});

我得到错误:

1) API 端点 /users “首先”钩子: 类型错误:无法解构“未定义”或“空”的属性email。 在 Object.exports.create (app\controllers\user.controller.js:5:13)

如何添加测试数据?

控制器:

 const user = require("../models/user.model.js");
const validator = require("email-validator");
// Create and Save a new user
exports.create = (req, res) => {
    const { query: { email, givenName, familyName } } = req;

    // Validate request
    if (!validator.validate(email) || !givenName || !familyName) {
        return res.status(400).send({
            message:
                "Please use a valid email address, given name and family name."
        });
    }

    // Create a user
    const User = new user({
        email,
        givenName,
        familyName
    });

    // Save user in the database
    User.save()
        .then(data => {
            res.send(data);
        })
        .catch(err => {
            res.status(500).send({
                message:
                    err.message || "Error occurred while creating the user."
            });
        });
};

// Retrieve and return all users from the database.
exports.findAll = (req, res) => {
    user
        .find()
        .then(users => {
            res.send(users);
        })
        .catch(err => {
            res.status(500).send({
                message:
                    err.message || "An error occurred while retrieving users."
            });
        });
};

// Find a single user with a userId
exports.findOne = (req, res) => {
    user
        .findById(req.params.userId)
        .then(user => {
            if (!user) {
                return res.status(404).send({
                    message: "user not found with id " + req.params.userId
                });
            }
            res.send(user);
        })
        .catch(err => {
            if (err.kind === "ObjectId") {
                return res.status(404).send({
                    message: "user not found with id " + req.params.userId
                });
            }
            return res.status(500).send({
                message: "Error retrieving user with id " + req.params.userId
            });
        });
};

// Update a user identified by the userId in the request
exports.update = (req, res) => {
    // Validate Request
    if (!req.body.content) {
        return res.status(400).send({
            message: "user content can not be empty"
        });
    }

    // Find user and update it with the request body
    user
        .findByIdAndUpdate(
            req.params.userId,
            {
                title: req.body.title || "Untitled user",
                content: req.body.content
            },
            { new: true }
        )
        .then(user => {
            if (!user) {
                return res.status(404).send({
                    message: "user not found with id " + req.params.userId
                });
            }
            res.send(user);
        })
        .catch(err => {
            if (err.kind === "ObjectId") {
                return res.status(404).send({
                    message: "user not found with id " + req.params.userId
                });
            }
            return res.status(500).send({
                message: "Error updating user with id " + req.params.userId
            });
        });
};

// Delete a user with the specified userId in the request
exports.delete = (req, res) => {
    user
        .findByIdAndRemove(req.params.userId)
        .then(user => {
            if (!user) {
                return res.status(404).send({
                    message: "user not found with id " + req.params.userId
                });
            }
            res.send({ message: "user deleted successfully!" });
        })
        .catch(err => {
            if (err.kind === "ObjectId" || err.name === "NotFound") {
                return res.status(404).send({
                    message: "user not found with id " + req.params.userId
                });
            }
            return res.status(500).send({
                message: "Could not delete user with id " + req.params.userId
            });
        });
};

【问题讨论】:

    标签: node.js mongoose mocha.js


    【解决方案1】:

    create 函数需要一个用户,而它接收一个用户数组作为参数。它的问题是它是一个中间件,它不返回一个承诺,所以它不能被有效地链接起来。它还会导致副作用并调用res.send,而这里使用的不需要这样做。

    这里应该直接使用Mongoose模型,它的create接受一个数组。该块应该返回一个承诺,以免在测试中导致竞争条件:

    const User = require(".../user.model.js");
    
    ...
    
    before(function() {
        const users = [...];
        return User.create(users);
    });
    

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2018-02-19
      • 2013-12-10
      相关资源
      最近更新 更多