2013-05-12 23 views
5

Ok, sto usando Meck e sono perso. La mia prima lingua (che scrivo da circa 7 mesi) è Ruby, quindi non riesco a spiegarmi come Meck si diverta ancora. Comunque ottengo Ruby beffardo. Sperando che qualcuno possa aiutarmi. Inoltre, ho solo scritto Erlang per una settimana.Come imitare gli oggetti in Erlang usando Meck?

Aggiornato codice (ma beffardo ancora non funziona) ...

Ho un console_io modulo suggeritore Erlang che assomiglia a questo:

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

La mia prova ora sembra questo:

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

L'errore che sto ottenendo è questo:

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

Voglio prendere in giro (mozza?) La funzione ottiene nel mio test in modo che venga restituito "aaaa" e quindi quando asserisco su get_guess() dovrebbe essere uguale a ["a", "a", " aa"].

Come posso fare?

risposta

11

ci sono due problemi:

  • Il modulo prompter ha due funzioni esportate, ma si deridere solo uno di loro (gets) con meck:expect. Per impostazione predefinita, Meck crea un nuovo modulo che solo contiene le funzioni che si prendono in giro esplicitamente. È possibile cambiare la situazione utilizzando l'opzione passthrough:

    meck:new(prompter, [passthrough]), 
    
  • Quando si deridere la funzione gets, tutti modulo con prefisso chiamate (cioè prompter:gets()) sono intercettati, ma Meck non ha modo di intercettare (ancora?) chiamate interne (ad esempio la chiamata gets() nella funzione guess), in modo da ottenere comunque la versione non bloccata della funzione.Non esiste un modo completamente soddisfacente per evitare questo. È possibile modificare la chiamata in guess a prompter:gets() oppure è possibile spostare gets in un modulo separato e deriderlo.

+0

Grazie mille! Ho provato a fare aggiungere il nome del modulo alla funzione nella chiamata ("cambia la chiamata in attesa di suggerire: gets()"). Purtroppo non ha funzionato. Così, ho finito per estrarre gets() al proprio modulo separato che avrei potuto prendere in giro seguendo le istruzioni di kjw0188. – Kelly

5

La prima riga dice per creare un nuovo modulo deriso, my_library_module:

meck:new(my_library_module), 

Successivamente, prendiamo in giro la funzione fib in my_library_module per tornare 21 quando 8 viene passato in:

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

Noi avere alcune asserzioni eunit per testare la nostra funzione derisoria. La chiamata code_under_test:run è ciò che si desidera sostituire con la funzione utilizzando il modulo deriso, e il 21 è il risultato vi aspettate dalla funzione chiamata:

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

Poi scaricare il modulo deriso:

meck:unload(my_library_module). 

Se si voleva scrivere lo stesso test per il modulo, si potrebbe scrivere:

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

Grazie mille! Ora capisco perfettamente. Tuttavia, il test continua a non passare. Ho aggiornato la domanda di cui sopra con il mio nuovo codice/test e l'errore che sto ottenendo. Spero che tu possa aiutarmi. – Kelly

+0

Che cosa fa meck: validate/1 negli esempi precedenti? Non riesco a risolverlo –

+0

C'è un'altra risposta che potrebbe rispondere alla tua domanda: https://stackoverflow.com/questions/43279705/whats-the-point-of-meckvalidate – kjw0188

Problemi correlati