简体   繁体   English

如何使用 mocha/chai 测试 ejs/nodejs function?

[英]How to test ejs/nodejs function with mocha/chai?

I have a function in a ejs/nodejs application that I need to test.我在需要测试的 ejs/nodejs 应用程序中有一个 function。 The function adds a user(name and array of 4 letter grades). function 添加了一个用户(名称和 4 个字母等级的数组)。 I want to test the function to verify that it adds one user.我想测试 function 以验证它是否添加了一个用户。

the function: function:

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

What I've been trying so far:到目前为止我一直在尝试什么:

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

Im getting an error that 'name' is undefined.我收到“名称”未定义的错误。 Could this be because of the req,res or the res.render?这可能是因为 req,res 或 res.render 吗?

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

Your function returns undefined but here you're checking the return value includes name.您的 function 返回 undefined 但在这里您正在检查返回值是否包含名称。 That's why it says name is undefined.这就是为什么它说名称未定义。

You want something like the below, you could use some sort of package to mock the request and response objects more appropriately.你想要类似下面的东西,你可以使用某种 package 来更恰当地模拟请求和响应对象。

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

await router.addUsers(fakeReq, fakeRes);

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM