使用before()添加用于摩卡测试的测试数据

时间:2018-11-04 20:18:50

标签: node.js mongoose mocha

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

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端点/用户        “之前”钩子:      TypeError:无法解构'undefined'或'null'的属性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
            });
        });
};

1 个答案:

答案 0 :(得分:0)

create函数在接收一个用户数组作为参数时会期望一个用户。它的问题在于它是一个中间件,不会返回承诺,因此无法有效地进行链接。它还会产生副作用,并调用res.send,而此处使用的方法则不需要。

猫鼬模型应在此处直接使用,其create接受一个数组。该区块应返回一个promise,以免在测试中引起竞争状况:

const User = require(".../user.model.js");

...

before(function() {
    const users = [...];
    return User.create(users);
});