(25)被迫吃芒果的前端工程師 - Mocha - MongoDB 編輯

前言

接下來就是準備進入編輯的章節了,畢竟前面都寫了新增的對不對~

編輯資料

如同前面所說的,接下來我們要製作編輯的測試,所以起手式就是先建立一個檔案叫做 update_test.js 或 edit_test.js 的檔案,然後呢?其實動作跟前面非常相似,內容先引入 Mocha 相關套件

1
2
const { describe, it, xit , beforeEach } = require("mocha");
const assert = require('assert');

起手式依然是脫離不了 describe,就像前面講的,describe 是一個群組的概念

1
2
3
describe('編輯使用者', () => {
...
})

記住!不要忘記引入使用者的 Model,否則你會無法繼續寫唷

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

那麼我們第一個要做的測試行為是什麼呢?也就是新增一筆使用者資料後再去編輯剛剛新增的內容,冰雪聰明的你可能會很快的這樣寫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const { describe, it } = require("mocha");
const User = require('../model/User');

describe('編輯使用者的流程測試', () => {
it('新增使用者', (done) => {
const judy = new User({
account: 'judy',
password: 'test1234',
nickname: 'judy',
age: 48,
job: '營造業',
})
})
})

但其實這邊這樣寫是有一點問題的,只是這邊先不說明是什麼樣的錯誤,先這樣子寫下去,當你撰寫好上面的使用者實例化之後,你可以透過 console.log(judy); 看到目前實例化的內容

judy

set

那我們這邊挑選更新 nicknameage 的欄位,該怎麼寫呢?其實使用 set() 語法就可以了

1
2
judy.set('nickname', 'mike');
judy.set('age', '18');

接下來就可以準備將修改後的資料儲存到資料庫內

1
2
3
4
judy.save().then((res) => {
assert(!judy.isNew);
done();
})

恭喜你這樣子就完成了。

測試成功

但是上面有一個地方是有點錯誤的,在上面的程式碼中,我們是使用 assert(!judy.isNew); 來斷言是否成功,也就是是否新增成功,但我們正確來講新增修改之後要重新拉取資料庫資料回來驗證才正確,因此要改寫成以下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
it('新增使用者', (done) => {
const judy = new User({
account: 'judy',
password: 'test1234',
nickname: 'judy',
age: 48,
job: '營造業',
})
judy.set('nickname', 'mike');
judy.set('age', '18');
judy.save()
.then(() => User.find({}))
.then((users) => {
assert(users[0].nickname === 'mike');
assert(users[0].age === 18)
done();
})
})

這樣才是正確的測試流程驗證

測試成功

update

更新的方式當然不只一個,其中也包含了 update,而寫法其實真的沒差到哪裡,難度也不高,所以這邊就直接給範例程式碼,只是要記得 save 你的實例化使用者資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
it('edit update methods', (done) => {
const judy = new User({
account: 'judy',
password: 'test1234',
nickname: 'judy',
age: 48,
job: '營造業',
});
judy.save().then(() => {
return judy.update({
nickname: 'mike',
age: 18,
})
})
.then(() => User.find({}))
.then((users) => {
assert(users[0].nickname === 'mike');
assert(users[0].age === 18)
done();
})
})

測試成功

相較之下我們可以發現 update 真的簡單許多。

findOneAndUpdate 與 findByIdAndUpdate

接下來是關於 findOneAndUpdatefindByIdAndUpdate 的部分,其實寫法都很雷同,只是這邊就要直接引用 User 的模型而已

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
41
42
43
it('edit findByIdAndUpdate methods', (done) => {
const mike = new User({
account: 'mike',
password: 'test1234',
nickname: 'mike',
age: 48,
job: '營造業',
});
mike.save().then(() => {
return User.findByIdAndUpdate(mike._id, {
nickname: 'judy',
age: 18,
})
})
.then((res) => User.find({}))
.then((users) => {
assert(users[0].nickname === 'judy');
assert(users[0].age === 18)
done();
})
})

it('edit findOneAndUpdate methods', (done) => {
const mike = new User({
account: 'mike',
password: 'test1234',
nickname: 'mike',
age: 48,
job: '營造業',
});
mike.save().then(() => {
return User.findOneAndUpdate({ nickname: 'mike' }, {
nickname: 'judy',
age: 18,
})
})
.then(() => User.find({}))
.then((users) => {
assert(users[0].nickname === 'judy');
assert(users[0].age === 18)
done();
})
})

Liker 讚賞

這篇文章如果對你有幫助,你可以花 30 秒登入 LikeCoin 並點擊下方拍手按鈕(最多五下)免費支持與牡蠣鼓勵我。
或者你可以也可以請我「喝一杯咖啡(Donate)」。

Buy Me A Coffee Buy Me A Coffee

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ