首页 > 解决方案 > 如何使用 mocha/chai 测试 ejs/nodejs 功能?

问题描述

我在需要测试的 ejs/nodejs 应用程序中有一个函数。该函数添加一个用户(名称和 4 个字母等级的数组)。我想测试该功能以验证它是否添加了一个用户。

功能:

router.addUsers = (req, res) => {
  console.log("in homeController addUser");

  var newUserName = req.body.name;
  console.log("name " + newUserName);
  var newUsergrade = req.body.grade;

  var temp = 0;
  newUsergrade.forEach(letter => {
    letter = letter.toUpperCase();
    switch (letter) {
      case 'A':
        letter = 4.0
        break
      case 'A-':
        letter = 3.7
        break
      case 'B+':
        letter = 3.3
        break
      case 'B':
        letter = 3.0
        break
      case 'B-':
        letter = 2.7
        break
      case 'C+':
        letter = 2.3
        break
      case 'C':
        letter = 2.0
        break
      case 'C-':
        letter = 1.7
        break
      case 'D+':
        letter = 1.3
        break
      case 'D':
        letter = 1.0
        break
      case 'F':
        letter = 0.0
        break
    }
    temp += letter;
  });

  var valid = false;

  if (temp / 4 >= 2.5) {
    valid = true;
  } else {
    vaild = false;
  }

  col.insertOne({
    name: newUserName,
    grade: newUsergrade,
    isValid: valid
  }, function(err, r) {
    test.equal(null, err);
    test.equal(1, r.insertedCount);
    col.find({}).toArray((err, userData) => {
      console.log("record found: ", userData);
      usersArray = userData;
    });

  });

  usersArray.push({
    name: newUserName
  });
  res.render("users", {
    allUsers: usersArray,
    title: "Users List"
  });
};

到目前为止我一直在尝试什么:

describe("addUsers", () => {
  it("should make sure a user can be added to the array", () => {
    var usersArray = {
      name: "blake",
      grade: ["a", "a", "b", "d"]
    };
    expect(router.addUsers(usersArray)).to.deep.include({
      name: "blake",
      grade: ["a", "a", "b", "d"]
    });
  });

  it("should return an empty object with empty request body input", () => {
    var emptyBody = {};
    expect(router.addUsers(emptyBody)).to.deep.include({});
  });
});

我收到“名称”未定义的错误。这可能是因为 req,res 或 res.render 吗?

标签: javascriptnode.jsroutesmocha.jschai

解决方案


    expect(router.addUsers(usersArray)).to.deep.include({
      name: "blake",
      grade: ["a", "a", "b", "d"]
    });

您的函数返回未定义,但在这里您正在检查返回值是否包含名称。这就是为什么它说名称未定义。

你想要像下面这样的东西,你可以使用某种包来更恰当地模拟请求和响应对象。

const fakeReq = { body: { name: 'something', grade: 'somethingElse' }},
  fakeRes = { render: () => {}};

await router.addUsers(fakeReq, fakeRes);

expect(usersArray).to.deep.include({ name: 'something' });

推荐阅读