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
type 'a configured_side_effect =
| Return of 'a
| Raise of exn
type 'a side_effect = 'a configured_side_effect option
let return x = Some (Return x)
let raise e = Some (Raise e)
let not_configured = None
let eval_side_effect = function
| Return x -> x
| Raise e -> Stdlib.raise e
type ('args, 'ret) t =
{ name: string
; params: 'args list ref
; side_effect: 'ret side_effect ref
}
let make ~name =
{ name
; params = ref []
; side_effect = ref not_configured
}
let name mock =
mock.name
let configure t side_effect =
t.side_effect := side_effect;
t.params := []
exception Mock_not_configured of string
let call mock args =
match !(mock.side_effect) with
| None
->
Stdlib.raise (Mock_not_configured mock.name)
| Some effect
->
begin
mock.params := args :: !(mock.params);
eval_side_effect effect
end
let recorded_calls mock =
List.rev !(mock.params)