[英]Testing ejs/nodejs function that uses mongoDB with mocha/chai
mongo 在 homeController.js 中是這樣設置的
const MongoDB = require("mongodb").MongoClient,
dbURL = "mongodb://localhost:27017",
dbName = "usersdb";
const collectionName = "contacts";
var test = require('assert');
var col;
var usersArray = []; // define an empty array as a placeholder
var gradesArray = [];
MongoDB.connect(dbURL, {
useUnifiedTopology: true,
useNewUrlParser: true,
useCreateIndex: true
},
(error, client) => {
if (error) throw error;
let db = client.db(dbName);
col = db.collection(collectionName, {
safe: false,
useUnifiedTechnology: true
}, (err, r) => {
if (err) {
console.log("Something is wrong in db.collection");
}
});
col.find()
.toArray((error, userData) => {
if (error) throw error;
usersArray = userData; // store all users in the array users[]
//console.log(userData);
});
// console.log(`All users: ${usersArray}`);
});
我在 homeController.js 中有一個 function 我想測試,它需要一個名稱和成績數組,轉換成績,檢查它們是否有效,並將它們推送到數據庫。 function 看起來像這樣並使用col
變量:
router.addUsers = (req, res) => {
console.log("in homeController addUser");
var newUserName = req.body.name;
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;
});
});
最后,我的 router.test.js 看起來像這樣:
describe("addUsers", () => {
it("should make sure a user can be added to the array", () => {
const fakeReq = {
body: {
name: 'something',
grade: ["a", "b", "a", "a"]
}
},
fakeRes = {
render: () => {}
};
router.addUsers(fakeReq, fakeRes);
// console.log(router.addUsers(fakeReq, fakeRes))
expect(usersArray).to.deep.include({
name: 'something'
});
});
});
我收到一個錯誤,說它不能insertOne
未定義的一個,這意味着我需要在我的測試中使用 mongoDB 部分。 我如何將其合並到我的測試中以測試此 function 是否添加了一個條目?
您正在測試一個中間件,就好像它是一個獨立的 function。 在這種情況下,您應該測試路由端點。 例如:
const request = require("supertest");
const expect = require("chai").expect;
const app = require('../app');
const mongoose = require('mongoose');
const faker = require("faker"); // to generate fake data
const Entity = require('../entities/discount'); // import schema
require('dotenv').config();
describe("GET /Entity/{entityID}", () => {
let body
beforeEach(async () => {
await Entity.deleteMany()
body = {
name: faker.name.title(),
image: faker.image.imageUrl()
}
const entity = new Entity({
_id: new mongoose.Types.ObjectId(),
...body
})
await entity.save()
})
describe("case of success", () => {
it("should work and return status 200 and message ...", async () => {
const res = await request(app)
.get("/entity /" + entityID )
expect(res.status).to.equal(200);
expect(res.body).to.exist
expect(res.body._id).to.exist
expect(res.body).to.have.property("name", body.name);
expect(res.body).to.have.property("image", body.image);
})
})
})
但是如果你想測試每個特定的 function,你應該生成處理某個動作的函數並特別測試這些動作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.