Kel*_*lly 6 tdd erlang mocking stub meck
好的,我正在使用Meck而且我迷路了.我的第一语言(我已经写了大约7个月)是Ruby,所以我似乎无法将我的大脑包裹在Meck中.我确实得到Ruby嘲笑.希望有人可以帮助我.另外,我一直在写Erlang一周.
更新的代码(但嘲弄仍然无效)......
我有一个Erlang console_io提示器模块,如下所示:
-module(prompter).
-export([prompt/1, guess/0]).
prompt(Message) ->
console_io:gets(Message).
gets() ->
{_, [Input]} = io:fread("Enter: ", "~s"),
Input.
guess() ->
Guess_Input = gets(),
Guess_List = convert_guess_to_list(Guess_Input).
convert_guess_to_list(Guess_Input) ->
re:split(Guess_Input, "", [{return, list}, trim]).
Run Code Online (Sandbox Code Playgroud)
我的测试现在看起来像这样:
-module(prompter_test).
-include_lib("eunit/include/eunit.hrl").
guess_1_test() ->
meck:new(prompter),
meck:expect(prompter, gets, fun() -> "aaaa" end),
?assertEqual(prompter:guess(), ["a","a","a","a"]),
?assert(meck:validate(prompter)),
meck:unload(prompter).
Run Code Online (Sandbox Code Playgroud)
我得到的错误是这样的:
Eshell V5.9.3.1 (abort with ^G)
1> prompter_test: guess_1_test (module 'prompter_test')...*failed*
in function prompter:guess/0
called as guess()
in call from prompter_test:guess_1_test/0 (test/prompter_test.erl, line 10)
in call from prompter_test:guess_1_test/0
**error:undef
Run Code Online (Sandbox Code Playgroud)
我想在我的测试中模拟(存根?)获取函数,以便获取将返回"aaaa"然后当我在get_guess()上断言它应该等于["a","a","a","a" ].
我该怎么做呢?
leg*_*cia 11
有两个问题:
该prompter
模块有两个导出函数,但你只用其中一个模拟(gets
)meck:expect
.默认情况下,Meck创建一个仅包含您明确模拟的函数的新模块.您可以使用以下passthrough
选项更改它:
meck:new(prompter, [passthrough]),
Run Code Online (Sandbox Code Playgroud)当你模拟这个gets
函数时,所有以模块为前缀的调用(即prompter:gets()
)被拦截,但是Meck没有办法(但是?)拦截内部调用(例如函数gets()
中的guess
调用),所以你仍然可以获得函数的未模拟版本.没有完全令人满意的方法来避免这种情况.您可以将呼叫更改guess
为prompter:gets()
,或者您可以移动gets
到单独的模块并模拟它.
第一行说创建一个新的模拟模块my_library_module
:
meck:new(my_library_module),
Run Code Online (Sandbox Code Playgroud)
接下来,我们模拟函数fib
in my_library_module
,当传入8时返回21:
meck:expect(my_library_module, fib, fun(8) -> 21 end),
Run Code Online (Sandbox Code Playgroud)
我们有一些eunit断言来测试我们的模拟函数.该code_under_test:run
调用是您想要使用模拟模块替换的函数,并且21
是您期望从函数调用得到的结果:
?assertEqual(21, code_under_test:run(fib, 8)), % Uses my_library_module
?assert(meck:validate(my_library_module)),
Run Code Online (Sandbox Code Playgroud)
然后我们卸载模拟的模块:
meck:unload(my_library_module).
Run Code Online (Sandbox Code Playgroud)
如果你想为你的模块编写相同的测试,你可以写:
my_test() ->
meck:new(console_io),
meck:expect(console_io, gets, fun() -> "aaaa" end),
?assertEqual(["a", "a", "a", "a"], console_io:get_guess()), % Uses console_io
?assert(meck:validate(console_io)),
meck:unload(console_io).
Run Code Online (Sandbox Code Playgroud)