2013-05-12 8 views
5

Okej, używam Meck i jestem zagubiony. Moim pierwszym językiem (który piszę od około 7 miesięcy) jest Ruby, więc nie jestem w stanie otoczyć mojego mózgu kpiną z Meck. Ale kpię sobie z Ruby. Mam nadzieję, że ktoś mi pomoże. Poza tym piszę Erlanga tylko przez tydzień.Jak wyśmiać obiekty w Erlangu za pomocą Meck?

Aktualizacja Code (ale szyderczy nadal nie działa) ...

Mam Erlang console_io moduł prompterów, który wygląda tak:

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

Mój próbny teraz wygląda to:

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

błąd dostaję to:

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 

chcę drwić (niedopałek?) Funkcja pobiera w moim teście tak, że dostaje powróci „aaaa”, a następnie, kiedy dochodzić na get_guess() powinno wynosić [ „a”, „a”, " a "," a "].

Jak to zrobić?

Odpowiedz

11

Istnieją dwa problemy:

  • Moduł prompter ma dwie funkcje eksportowane, ale tylko jeden z nich drwić (gets) o meck:expect. Domyślnie Meck tworzy nowy moduł, który zawiera tylko te funkcje, które jawnie kpi. Można to zmienić za pomocą opcji passthrough:

    meck:new(prompter, [passthrough]), 
    
  • Kiedy drwicie funkcję gets wszystkie Moduł-prefiksem połączenia (tj prompter:gets()) są przechwytywane, ale Meck nie ma możliwości przechwycenia (jeszcze?) wewnętrzne wywołania (np. Wywołanie gets() w funkcji guess), więc nadal otrzymasz niezmienioną wersję funkcji.Nie ma całkowicie zadowalającego sposobu, aby tego uniknąć. Możesz zmienić wywołanie w guess na prompter:gets(), lub możesz przenieść gets do osobnego modułu i wyśmiewać to.

+0

Dziękuję bardzo! Próbowałem dodać nazwę modułu do funkcji w wywołaniu ("zmień wywołanie w odgadywaniu na monit: gets()"). To niestety nie zadziałało. Więc skończyłem wyciągając gets() do własnego oddzielnego modułu, który mógłbym następnie sfałszować zgodnie z instrukcjami od kjw0188. – Kelly

5

Pierwsza linia mówi, aby utworzyć nowy moduł wyśmiewany, my_library_module:

meck:new(my_library_module), 

Następnie, drwić funkcję fib w my_library_module powrót 21, kiedy 8 jest przekazywana w:

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

Mamy miejmy kilka eunitowych stwierdzeń, aby przetestować naszą wyśmiewaną funkcję. code_under_test:run połączenie jest co chcesz zamienić z funkcji za pomocą szydzili moduł, a 21 jest wynikiem spodziewasz się od wywołania funkcji:

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

Potem wyładowania szydzili moduł:

meck:unload(my_library_module). 

Jeśli chciałem napisać ten sam test na module, można napisać:

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

Dziękuję bardzo! Zrozumiałem to teraz. Jednak test wciąż nie przechodzi. Zaktualizowałem powyższe pytanie z nowym kodem/testem i błędem, który otrzymuję. Mam nadzieję, że możesz mi pomóc. – Kelly

+0

Co oznacza meck: validate/1 w powyższych przykładach? Nie mogę tego rozwiązać –

+0

Istnieje inna odpowiedź, która może odpowiedzieć na twoje pytanie: https://stackoverflow.com/questions/43279705/whats-the-point-of-meckvalidate – kjw0188

Powiązane problemy