簡體   English   中英

測試使用 mongoDB 和 mocha/chai 的 ejs/nodejs function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM