2013-05-12 5 views
5

Хорошо, я использую Мек, и я потерян. Мой первый язык (который я писал около 7 месяцев) - это Ruby, поэтому я, похоже, не могу обмануть моего мозга вокруг Meck. Я все равно получаю Руби. Надеюсь, кто-то может мне помочь. Кроме того, я только писал Erlang в течение недели.Как издеваться над объектами в Эрланге с помощью Meck?

Обновленный кодекс (но насмешливый до сих пор не работает) ...

У меня есть console_io модуль суфлера Erlang, который выглядит следующим образом:

-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]). 

Мой тест теперь выглядит следующим образом это:

-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). 

ошибка я получаю это:

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 

Я хочу высмеять (заглушку?), Чтобы получить функцию в моем тесте, чтобы get вернул «aaaa», а затем, когда я утверждаю на get_guess(), он должен равняться ["a", "a", " a "," a "].

Как это сделать?

ответ

11

Есть две проблемы:

  • Модуль prompter имеет две экспортируемые функции, но вы только дразнить один из них (gets) с meck:expect. По умолчанию Meck создает новый модуль, который только содержит функции, которые вы явно высмеиваете. Вы можете изменить это с помощью passthrough опции:

    meck:new(prompter, [passthrough]), 
    
  • Когда вы дразнить функцию gets, все модуль префиксом вызовов (т.е. prompter:gets()) перехватываются, но Мекк не имеет возможностей перехватывать (пока?) внутренних вызовов (например, вызов gets() в функции guess), поэтому вы все равно получите незафиксированную версию функции.Нет абсолютно удовлетворительного способа избежать этого. Вы могли бы изменить вызов в guess на prompter:gets(), или вы могли бы переместить gets в отдельный модуль и издеваться над этим.

+0

Большое вам спасибо! Я попытался добавить имя модуля в функцию в вызове («изменить вызов в угадывании на prompter: gets()»). К сожалению, это не сработало. Итак, я в конечном итоге вытащил get() в свой отдельный модуль, который я мог затем издеваться над инструкциями от kjw0188. – Kelly

5

Первая строка говорит, чтобы создать новый Передразнивало модуль, my_library_module:

meck:new(my_library_module), 

Далее мы издеваться функцию fib в my_library_module для возврата 21, когда 8 передается в:

meck:expect(my_library_module, fib, fun(8) -> 21 end), 

Мы есть некоторые утверждения eunit, чтобы проверить нашу насмешку. code_under_test:run вызова, что вы хотите заменить на функции с помощью высмеивала модуль и 21 результата вы ожидаете от вызова функции:

?assertEqual(21, code_under_test:run(fib, 8)), % Uses my_library_module 
    ?assert(meck:validate(my_library_module)), 

Тогда мы выгрузить высмеивали модуль:

meck:unload(my_library_module). 

Если вы хотите, чтобы написать тот же тест для модуля, вы можете написать:

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). 
+0

Большое вам спасибо! Я полностью понимаю это сейчас. Тем не менее, тест все еще не проходит. Я обновил вопрос выше с помощью моего нового кода/теста и ошибки, которую я получаю. Надеюсь, вы можете мне помочь. – Kelly

+0

Что делает meck: validate/1 действительно делать в приведенных выше примерах? Я не могу это обработать – 2017-06-01 09:15:18

+0

Есть еще один ответ, который может ответить на ваш вопрос: https://stackoverflow.com/questions/43279705/whats-the-point-of-meckvalidate – kjw0188

Смежные вопросы