1
1
const test = require ( 'node:test' ) ;
2
2
const assert = require ( 'assert' ) ;
3
+ const fs = require ( 'fs' ) ;
4
+
5
+ // 模擬 fs.readFile 方法,返回假數據
6
+ test . mock . method ( fs , 'readFile' , ( file , options , callback ) => {
7
+ callback ( null , 'Alice\njohn\nBob' ) ;
8
+ } ) ;
9
+
10
+ // 從 main.js 導入 Application 和 MailSystem 類
3
11
const { Application, MailSystem } = require ( './main' ) ;
4
12
5
- // TODO: write your tests here
6
- // Remember to use Stub, Mock, and Spy when necessary
13
+ // 測試 MailSystem_write() 方法
14
+ test ( 'MailSystem_write()' , ( ) => {
15
+ const ms = new MailSystem ( ) ;
16
+ assert . strictEqual ( ms . write ( 'Alice' ) , 'Congrats, Alice!' ) ; // 確認寫入郵件的功能
17
+ assert . strictEqual ( ms . write ( null ) , 'Congrats, null!' ) ; // 確認處理空值的功能
18
+ assert . strictEqual ( ms . write ( 512558014 ) , 'Congrats, 512558014!' ) ; // 確認處理數字名稱的功能
19
+ } ) ;
20
+
21
+ // 測試 MailSystem_send() 方法
22
+ test ( 'MailSystem_send()' , ( ) => {
23
+ const ms = new MailSystem ( ) ;
24
+ const name = 'Alice' ;
25
+ test . mock . method ( Math , 'random' , ( ) => 0.6 ) ; // 假設 Math.random() 始終返回 0.6
26
+ assert . strictEqual ( ms . send ( name , 'success' ) , true ) ; // 確認發送成功郵件的功能
27
+ test . mock . method ( Math , 'random' , ( ) => 0.4 ) ; // 假設 Math.random() 始終返回 0.4
28
+ assert . strictEqual ( ms . send ( name , 'fail' ) , false ) ; // 確認發送失敗郵件的功能
29
+ } ) ;
30
+
31
+ // 測試 Application_getNames() 方法
32
+ test ( 'Application_getNames()' , async ( ) => {
33
+ const app = new Application ( ) ;
34
+ const name_list = [ 'Alice' , 'john' , 'Bob' ] ;
35
+ const names = await app . getNames ( ) ;
36
+ assert . deepStrictEqual ( names , [ name_list , [ ] ] ) ; // 確認獲取名字列表的功能
37
+ } ) ;
38
+
39
+ // 測試 Application_getRandomPerson() 方法
40
+ test ( 'Application_getRandomPerson()' , async ( ) => {
41
+ const app = new Application ( ) ;
42
+ const [ names ] = await app . getNames ( ) ; // 等待獲取名字列表
43
+ const randomPerson = app . getRandomPerson ( ) ;
44
+ assert . ok ( names . includes ( randomPerson ) ) ; // 確認隨機獲取的人員在名字列表中
45
+ } ) ;
46
+
47
+ // 測試 Application_selectNextPerson() 方法
48
+ test ( 'Application_selectNextPerson()' , async ( ) => {
49
+ const app = new Application ( ) ;
50
+ const [ names ] = await app . getNames ( ) ;
51
+ app . selected = [ 'Alice' ] ;
52
+ let cnt = 0 ;
53
+ test . mock . method ( app , 'getRandomPerson' , ( ) => {
54
+ if ( cnt <= names . length ) {
55
+ return names [ cnt ++ ] ;
56
+ }
57
+ } ) ;
58
+ assert . strictEqual ( app . selectNextPerson ( ) , 'john' ) ; // 確認選擇下一個人員的功能
59
+ assert . deepStrictEqual ( app . selected , [ 'Alice' , 'john' ] ) ; // 確認已選擇的人員列表
60
+ assert . strictEqual ( app . selectNextPerson ( ) , 'Bob' ) ; // 確認選擇下一個人員的功能
61
+ assert . deepStrictEqual ( app . selected , [ 'Alice' , 'john' , 'Bob' ] ) ; // 確認已選擇的人員列表
62
+ assert . strictEqual ( app . selectNextPerson ( ) , null ) ; // 確認已無可選擇的人員
63
+ } ) ;
64
+
65
+ // 測試 Application_notifySelected() 方法
66
+ test ( 'Application_notifySelected()' , async ( ) => {
67
+ const app = new Application ( ) ;
68
+ const [ people ] = await app . getNames ( ) ;
69
+ app . selected = [ ...people ] ;
70
+ app . mailSystem . send = test . mock . fn ( app . mailSystem . send ) ;
71
+ app . mailSystem . write = test . mock . fn ( app . mailSystem . write ) ;
72
+ app . notifySelected ( ) ;
73
+ assert . strictEqual ( app . mailSystem . send . mock . calls . length , people . length ) ; // 確認發送郵件的次數
74
+ assert . strictEqual ( app . mailSystem . write . mock . calls . length , people . length ) ; // 確認編寫郵件的次數
75
+ } ) ;
0 commit comments