📜  如何将摩卡与mongoose一起使用?

📅  最后修改于: 2022-05-13 01:56:50.357000             🧑  作者: Mango

如何将摩卡与mongoose一起使用?

Mocha: Mocha 是一个测试框架,用于在我们的应用程序中执行测试。它确保一切正常。

'Mocha in Node.js' 是指在 Node.js 运行环境中使用 mocha 单元测试框架。 Mocha 有很多很棒的功能。

主要特征:

  • 简单的异步支持。
  • 异步测试超时支持。
  • 使用您想要的任何断言库
  • 之前、之后、之前、之后每个钩子对于清理每个测试的环境非常有用。

如果您不熟悉mongoose ,请单击此处。

在一段时间内,我们的应用程序将有比实际应用程序基本原理更多的代码行数进行测试。因此,编写测试并遵循测试驱动开发或 TDD 方法始终是一件值得感谢的事情。

在这篇文章中,我们将建立一个基本的测试套件,使用最著名的 Mocha 测试结构,使用Mongoose库在 MongoDB 数据集上创建我们的 Create Read Update and Delete (CRUD) 过程。

安装模块:

npm i mocha mongoose

文件夹结构:我们将在测试目录中创建所有的测试文件。

在我们的 Node.js-MongoDB 项目中,我们将使用这个帮助文件来创建连接。如果您是 MongoDB 新手,请查看这篇文章。

test_helper.js
// test/test_helper.js
  
const mongoose = require('mongoose');
  
// tells mongoose to use ES6 implementation of promises
mongoose.Promise = global.Promise;
const MONGODB_URI = 'mongodb://mongodb0.example.com:27017';
mongoose.connect(MONGODB_URI);
  
mongoose.connection
    .once('open', () => console.log('Connected!'))
    .on('error', (error) => {
        console.warn('Error : ', error);
    });
      
    // runs before each test
    beforeEach((done) => {
        mongoose.connection.collections.users.drop(() => {
        done();
       });
});


user.js
// Inside schema/user.js
  
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
  
const UserSchema = new Schema({
    name: {
        type: String,
        required: [true, 'Name is required.']
      },
    age: Integer
 })
   
// it represents the entire collection of User data
const User = mongoose.model('User', UserSchema);
module.exports = User;


create_test.js
//import the User model
const User = require('../schema/user');
const assert = require('assert');
  
describe('Creating documents in MongoDB', () => {
    it('Creates a New User', (done) => {
        const newUser = new User({ name: 'Shriyam' });
        newUser.save() // returns a promise after some time
            .then(() => {
                //if the newUser is saved in db and it is not new
                assert(!newUser.isNew);
                done();
            });
    });
});


read_test.js
const User = require('../schema/user');
const assert = require('assert');
  
let user;
// this will run before running every test
beforeEach(() => {
    // Creating a new Instance of User Model
    user = new User({  name: 'Shriyam' });
    user.save()
        .then(() => done());
});
  
describe('Reading Details of User', () => {
    it('Finds user with the name', (done) => {
        User.findOne({ name: 'Shriyam' })
            .then((user) => {
                assert(user.name === 'Shriyam');
                done();
            });
    })
})


delete_test.js
const User = require('../schema/user');
const assert = require('assert');
  
describe('Deleting a User', () => {
  
    let user;
    beforeEach((done), () => {
        // user is an instance of User Model
        user = new User({ name: 'Shriyam' });
        user.save()
            .then(() => done());
    });
  
    it('Removes a User using its instance', (done) => {
    User.remove()
        // Checking if the user was deleted from DB or not
        .then(() => User.findOne({ name: 'Shriyam' }))
        .then((user) => {
            assert(user === null);
            done();
        });
    });
  
    it('Removes a user', (done) => {
    User.findOneAndRemove({ name: 'Shriyam' })
        .then(() => User.findOne({ name: 'Shriyam' }))
        .then((user) => {
            assert(user === null);
            done();
        });
    });
  
    it('Removes a user using its id', (done) => {
    User.findIdAndRemove(user._id)
        .then(() => User.findOne({ name: 'Shriyam' }))
        .then((user) => {
            assert(user === null);
            done();
        });
    })
})


update_test.js
const Username = require('../schema/user');
const assert = require('assert');
  
describe('Deleting a user', () => {
  
    let user;
    beforeEach((done) => {
        user = new User({ name: 'Shriyam' });
        user.save()
            .then(() => done());
    });
  
    // Handling Redundant Code
    function helperFunc(assertion, done) {
    assertion
        .then(() => User.find({}))
        .then((users) => {
            assert(users.length === 1);
            assert(users[0].name === 'Updated Shriyam');
            done();
        });
    }
  
    it('Sets and saves a user using an instance', (done) => {
        // Not yet updated in MongoDb
        user.set('name', 'Updated Shriyam');
        helperFunc(user.save(), done);
    });
  
    it('Update a user using instance', (done) => {
        helperFunc(user.update({ name: 'Updated Shriyam' }), done);
    });
});


在测试运行之前,我们将使用 beforeEach() 挂钩清空我们的数据库。删除需要时间,所以我们需要在操作完成之前持有 mocha。调用 done()函数表示操作现在已经完成,我们可以继续执行。

.on() 和 .once() 是事件处理程序。他们将事件作为第一个参数,将一个函数作为第二个参数,一旦事件发生就会执行。

我们的 MongoDB 架构:

用户.js

// Inside schema/user.js
  
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
  
const UserSchema = new Schema({
    name: {
        type: String,
        required: [true, 'Name is required.']
      },
    age: Integer
 })
   
// it represents the entire collection of User data
const User = mongoose.model('User', UserSchema);
module.exports = User;

现在,我们需要 package.json 文件中的脚本来开始测试。

"scripts": { 
  "test" : "mocha --recursive --exit"
 }

在 -recursive 中意味着它将在测试目录中递归测试,并且在所有测试执行完毕后 -exit 退出。使用以下命令使用 Mocha 运行测试。

npm run test

Mocha 为我们提供了一个 describe()函数,它以一个字符串作为第一个参数,用于识别通过或失败的测试组,测试逻辑在 describe() 的第二个参数中实现为函数。

describe() 可以在 it() 方法或嵌套的 describe() 函数中包含多个测试。在我们的例子中,我们将为 MongoDB 中的每个 CRUD 操作创建不同的文件。或者,我们可以使用具有不同描述块的单个文件。

由于每个测试都需要我们断言一些东西,所以 Mocha 允许我们使用许多断言库。在这里,我们将使用 Node.js 的内置断言模块。

通过在测试回调中将 done() 添加到 it(),Mocha 将知道该测试已经完成。

create_test.js

//import the User model
const User = require('../schema/user');
const assert = require('assert');
  
describe('Creating documents in MongoDB', () => {
    it('Creates a New User', (done) => {
        const newUser = new User({ name: 'Shriyam' });
        newUser.save() // returns a promise after some time
            .then(() => {
                //if the newUser is saved in db and it is not new
                assert(!newUser.isNew);
                done();
            });
    });
});

read_test.js

const User = require('../schema/user');
const assert = require('assert');
  
let user;
// this will run before running every test
beforeEach(() => {
    // Creating a new Instance of User Model
    user = new User({  name: 'Shriyam' });
    user.save()
        .then(() => done());
});
  
describe('Reading Details of User', () => {
    it('Finds user with the name', (done) => {
        User.findOne({ name: 'Shriyam' })
            .then((user) => {
                assert(user.name === 'Shriyam');
                done();
            });
    })
})

delete_test.js

const User = require('../schema/user');
const assert = require('assert');
  
describe('Deleting a User', () => {
  
    let user;
    beforeEach((done), () => {
        // user is an instance of User Model
        user = new User({ name: 'Shriyam' });
        user.save()
            .then(() => done());
    });
  
    it('Removes a User using its instance', (done) => {
    User.remove()
        // Checking if the user was deleted from DB or not
        .then(() => User.findOne({ name: 'Shriyam' }))
        .then((user) => {
            assert(user === null);
            done();
        });
    });
  
    it('Removes a user', (done) => {
    User.findOneAndRemove({ name: 'Shriyam' })
        .then(() => User.findOne({ name: 'Shriyam' }))
        .then((user) => {
            assert(user === null);
            done();
        });
    });
  
    it('Removes a user using its id', (done) => {
    User.findIdAndRemove(user._id)
        .then(() => User.findOne({ name: 'Shriyam' }))
        .then((user) => {
            assert(user === null);
            done();
        });
    })
})

update_test.js

const Username = require('../schema/user');
const assert = require('assert');
  
describe('Deleting a user', () => {
  
    let user;
    beforeEach((done) => {
        user = new User({ name: 'Shriyam' });
        user.save()
            .then(() => done());
    });
  
    // Handling Redundant Code
    function helperFunc(assertion, done) {
    assertion
        .then(() => User.find({}))
        .then((users) => {
            assert(users.length === 1);
            assert(users[0].name === 'Updated Shriyam');
            done();
        });
    }
  
    it('Sets and saves a user using an instance', (done) => {
        // Not yet updated in MongoDb
        user.set('name', 'Updated Shriyam');
        helperFunc(user.save(), done);
    });
  
    it('Update a user using instance', (done) => {
        helperFunc(user.update({ name: 'Updated Shriyam' }), done);
    });
});

所以,我们现在已经学习了如何使用 Mocha 和Mongoose创建单元测试。
提示:使用mockgoose库来使用 Dummy MongoDB 数据库,以便您的原始数据库保持干净。