(26)被迫吃芒果的前端工程師 - Mocha - MongoDB 讀取

前言

接下來就是關於讀取的測試撰寫囉~

讀取

那麼一樣我們先建立一個檔案叫做 reading_test.js,然後因為每一次執行測試檔案都會被刪除

1
2
3
4
beforeEach((done) => {
const { users } = mongoose.connection.collections;
user.drop(() => done());
})

因此在做讀取測試的時候,我們也是一樣要自己去新增使用者資料,但是這次就不再一一建立,而是在執行這個測試單元之前,先跑一下 beforeEach,在執行每一個測試之前我們都要先跑過一輪 beforeEach,透過這個小技巧我們可以先將使用者給儲存到資料庫內

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const { describe, it, xit , beforeEach } = require("mocha");
const assert = require('assert');

const User = require('../model/User');


describe('Updating records', () => {
let judy;
beforeEach((done) => {
judy = new User({
account: 'judy',
password: 'test1234',
nickname: 'judy',
age: 48,
job: '營造業',
})
judy.save().then(() => done()).catch(done);
})
})

你可能會想說為什麼要將 judy 宣告在外面,主要原因是因為我們會一直需要使用到 User 實例化之後的 _id 因此就必須將該實例化給儲存在外層,這樣子每一次都可以取得 _id

接下來起手式其實都差不多,都是 describe 然後多個 it,因此這邊就不再多解釋了。

find

首先一開始最簡單的就是 find,我們都知道 find 會找出相同名字的使用者,並且回傳一個陣列,因此你可能會這樣寫

1
2
3
4
5
6
it('找出所有叫做 judy 的使用者', (done) => {
User.find({ nickname: 'judy'}).then((user) => {
assert(user[0]._id === judy._id)
done();
});
});

基本上這樣寫 assert(user[0]._id === judy._id) 是會發生錯誤的,原因是因為 user[0]._idjudy._id 會回傳一個物件型別

new Object

那麼該怎麼解決呢?其實非常簡單,只需要使用 toString 來呼叫就可以解決囉~

1
2
3
4
5
6
it('找出所有叫做 judy 的使用者', (done) => {
User.find({ nickname: 'judy'}).then((user) => {
assert(user[0]._id.toString() === judy._id.toString()); // true
done();
});
});

透過 toString 語法我們就可以正確取得一個單純的字串 ID 而不是一個物件哩。

findOne

findOnefind 雷同,但主要是搜尋一筆資料,而這個測試大多我們會用 id 來做比較,但是這邊再傳入給 MongoDB 的時候不用特別使用 toString() 只需要直接使用就好

1
2
3
4
5
6
it('找出叫做 judy 的使用者', (done) => {
User.findOne({ _id: judy._id }).then((user) => {
assert(user.nickname === 'judy');
done()
})
});

分頁概念

我們在開發系統的時候其實很常使用分頁功能,而分頁功能其實就是使用 MongoDB 中的幾個語法做到的

  • limit
    • 限制筆數
  • skip
    • 跳過幾筆

最後我們可能會排序一下,那麼就會使用 sort 來排序一下資料,而寫法非常簡單,如果你有寫過 jQuery 的話會覺得很簡單,因為就是鏈式寫法。

但是我們這邊資料只有一筆,因此要新增兩三筆來達到這個需求,所以要稍微改一下 beforeEach,這邊我就不說明了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
let judy, maria, alex , zach;
beforeEach((done) => {
judy = new User({
account: 'judy',
password: 'test1234',
nickname: 'judy',
age: 48,
job: '營造業',
})
maria = new User({
account: 'maria',
password: 'test1234',
nickname: 'maria',
age: 48,
job: '營造業',
})
alex = new User({
account: 'alex',
password: 'test1234',
nickname: 'alex',
age: 48,
job: '營造業',
})
zach = new User({
account: 'zach',
password: 'test1234',
nickname: 'zach',
age: 48,
job: '營造業',
})

Promise.all([
judy.save(),
maria.save(),
alex.save(),
zach.save(),
])
.then(() => done())
.catch(done)
})

測試呢?我就直接給範例不說明哩

1
2
3
4
5
6
7
8
9
10
11
12
13
it('限制輸出結果,並做排序等', (done) => {
User.find({})
.sort({ nickname: 1})
.skip(1)
.limit(2)
.then((users) => {
console.log(users);
assert(users.length === 2);
assert(users[0].nickname === 'judy');
assert(users[1].nickname === 'maria');
done();
})
})

以上就是 MongoDB 的測試讀取練習哩。