1
1
const test = require ( 'node:test' ) ;
2
2
const assert = require ( 'assert' ) ;
3
+ const fs = require ( 'fs' ) ;
4
+
5
+ // 模擬 fs.readFile
6
+ function mockReadFile ( path , encoding , callback ) {
7
+ callback ( null , 'Alice\nBob\nCharlie' ) ; // Stub
8
+ }
9
+ const mockFsRead = test . mock . method ( fs , 'readFile' , mockReadFile ) ;
10
+
11
+ const { Application, MailSystem } = require ( './main' ) ;
12
+
13
+ test ( 'MailSystem: write()' , ( ) => {
14
+ const mailSystem = new MailSystem ;
15
+ assert . strictEqual ( mailSystem . write ( 'Alice' ) , 'Congrats, Alice!' ) ;
16
+ } ) ;
17
+
18
+ test ( 'MailSystem: send() success case' , ( ) => {
19
+ function returnHigh ( ) { return 0.9 ; } // Stub
20
+ const mailSystem = new MailSystem ( ) ;
21
+ const mockRandom = test . mock . method ( Math , 'random' , returnHigh ) ;
22
+ assert . strictEqual ( mailSystem . send ( 'Alice' , 'Congrats, Alice!' ) , true ) ;
23
+ mockRandom . mock . restore ( ) ;
24
+ } ) ;
25
+
26
+ test ( 'MailSystem: send() failure case' , ( ) => {
27
+ function returnLow ( ) { return 0.1 ; } // Stub
28
+ const mailSystem = new MailSystem ( ) ;
29
+ const mockRandom = test . mock . method ( Math , 'random' , returnLow ) ;
30
+ assert . strictEqual ( mailSystem . send ( 'Alice' , 'Congrats, Alice!' ) , false ) ;
31
+ mockRandom . mock . restore ( ) ;
32
+ } ) ;
33
+
34
+ test ( 'Application: constructor initializes names' , async ( ) => {
35
+ const app = new Application ( ) ;
36
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 10 ) ) ; // Wait for async init
37
+ assert . deepStrictEqual ( app . people , [ 'Alice' , 'Bob' , 'Charlie' ] ) ;
38
+ assert . deepStrictEqual ( app . selected , [ ] ) ;
39
+ } ) ;
40
+
41
+ test ( 'Application: getRandomPerson()' , ( ) => {
42
+ function returnFirst ( ) { return 0 ; }
43
+ const app = new Application ( ) ;
44
+ const mockRandom = test . mock . method ( Math , 'random' , returnFirst ) ;
45
+ assert . strictEqual ( app . getRandomPerson ( ) , 'Alice' ) ;
46
+ mockRandom . mock . restore ( ) ;
47
+ } ) ;
48
+
49
+ test ( 'Application: selectNextPerson()' , async ( ) => {
50
+ const application = new Application ( ) ;
51
+ await new Promise ( resolve => setTimeout ( resolve , 50 ) ) ;
52
+
53
+ function returnApple ( ) {
54
+ return 'Apple' ;
55
+ }
56
+ const mockrandompersonA = test . mock . method ( application , 'getRandomPerson' , returnApple ) ;
57
+ assert . strictEqual ( application . selectNextPerson ( ) , 'Apple' ) ;
58
+ assert . deepStrictEqual ( application . selected , [ 'Apple' ] ) ;
59
+ mockrandompersonA . mock . restore ( ) ;
60
+
61
+ let cnt = 0 ;
62
+ function returnAppleThenBanana ( ) {
63
+ return cnt ++ === 0 ? 'Apple' : 'Banana' ;
64
+ }
65
+ const mockrandompersonAB = test . mock . method ( application , 'getRandomPerson' , returnAppleThenBanana ) ;
66
+ assert . strictEqual ( application . selectNextPerson ( ) , 'Banana' ) ;
67
+ assert . deepStrictEqual ( application . selected , [ 'Apple' , 'Banana' ] ) ;
68
+ mockrandompersonAB . mock . restore ( ) ;
69
+
70
+ function returnOrange ( ) {
71
+ return 'Orange' ;
72
+ }
73
+ const mockrandompersonO = test . mock . method ( application , 'getRandomPerson' , returnOrange ) ;
74
+ assert . strictEqual ( application . selectNextPerson ( ) , 'Orange' ) ;
75
+ assert . deepStrictEqual ( application . selected , [ 'Apple' , 'Banana' , 'Orange' ] ) ;
76
+ mockrandompersonO . mock . restore ( ) ;
77
+
78
+ assert . strictEqual ( application . selectNextPerson ( ) , null ) ;
79
+ } ) ;
80
+
81
+ test ( 'Application: notifySelected()' , ( ) => {
82
+ const app = new Application ( ) ;
83
+ app . selected = [ 'Alice' , 'Bob' ] ;
84
+
85
+ const mockWrite = test . mock . method ( app . mailSystem , 'write' ) ;
86
+ const mockSend = test . mock . method ( app . mailSystem , 'send' ) ;
87
+
88
+ app . notifySelected ( ) ;
89
+
90
+ assert . strictEqual ( mockWrite . mock . callCount ( ) , 2 ) ;
91
+ assert . strictEqual ( mockSend . mock . callCount ( ) , 2 ) ;
92
+ mockWrite . mock . restore ( ) ;
93
+ mockSend . mock . restore ( ) ;
94
+ } ) ;
95
+ = === ===
3
96
const { Application, MailSystem } = require ( './main' ) ;
4
97
5
98
// TODO: write your tests here
6
- // Remember to use Stub, Mock, and Spy when necessary
99
+ // Remember to use Stub, Mock, and Spy when necessary
0 commit comments