-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmock_functions.test.js
123 lines (90 loc) · 3.39 KB
/
mock_functions.test.js
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// # Mock Functions
// 2つのmockの用意の仕方がある。
// forrach関数をテストするっていうケースを想像してみよう。こいつはiterableを引数にとって、ひとつずつ返すっていう関数だ。
function foreach(items, callback) {
for (let index = 0; index < items.length; index++) {
callback(items[index]);
}
}
// この関数をテストするために、mock 関数を用意して、期待通りのcallbackの実行が保証されたmockの状態を見てみよう。
const mockCallback = jest.fn(x => 42 + x);
foreach([0, 1], mockCallback);
// mockは呼ばれた回数やらなにやらを覚えている?
test('mock forensic', () => {
expect(mockCallback.mock.calls.length).toBe(2);
// The first argument of the first call to the function was 0
expect(mockCallback.mock.calls[0][0]).toBe(0);
// The first argument of the second call to the function was 1
expect(mockCallback.mock.calls[1][0]).toBe(1);
// The return value of the first call to the function was 42
expect(mockCallback.mock.results[0].value).toBe(42);
});
const myMock = jest.fn();
console.log(myMock()); // undefned
console.log(myMock()); // undefned
myMock.mockReturnValueOnce(10).mockReturnValue('hoge');
console.log(myMock());
console.log(myMock());
console.log(myMock());
console.log(myMock());
console.log(myMock());
console.log(myMock());
// ## モジュールのモック
// あとでやる
// ## モックの実装
const filterTestFn = jest.fn();
filterTestFn.mockReturnValueOnce(true).mockImplementationOnce(false);
const result = [11, 12].filter(filterTestFn);
console.log(result); // 11
console.log(filterTestFn.mock.calls);
const myMockFn1 = jest.fn().mockImplementation(() => {
return 'aaaa';
});
const myMockFn2 = jest.fn().mockImplementationOnce(() => {
return 'bbbbbb';
}).mockImplementationOnce(() => {
return 'ccccccc';
});
console.log(myMockFn1());
console.log(myMockFn1());
console.log(myMockFn2());
console.log(myMockFn2());
console.log(myMockFn2()); // undefined
const myMockFn3 = jest.fn(() => {
return 'default';
}).mockImplementationOnce(() => {
return 'temporaly function';
});
console.log(myMockFn3());
console.log(myMockFn3());
console.log(myMockFn3());
console.log(myMockFn3());
// >よくチェーンされる(そしてのために常に thisを返す必要のある)メソッドがあるケースのために
// >この実装を単純化する糖衣APIを.mockReturnThis() の形で全てのモックが備えています。
// 何を言っているのかよくわからないが、とりあえず写経すると…
const myObj = {
myMethod: jest.fn().mockReturnThis(),
};
// したのと一緒
const otherObj = {
myMethod: jest.fn(function() {
return this;
}),
};
console.log(myObj);
console.log(otherObj);
// mock名
console.log(myMockFn3());
myMockFn3.mockName('saegusa key');
console.log(myMockFn3());
// Custom Matcher
// The mock function was called at least once
test('mock function test', () => {
expect(myMockFn3).toBeCalled();
// The mock function was called at least once with the specified args
//expect(myMockFn3).toBeCalledWith(arg1, arg2);
// The last call to the mock function was called with the specified args
//expect(myMockFn3).lastCalledWith(arg1, arg2);
// All calls and the name of the mock is written as a snapshot
expect(myMockFn3).toMatchSnapshot();
});