Ho un'app Phoenix (che è solo un'ape riposante senza front-end) e uno dei controller fa alcune cose che voglio testare, ma alla fine del controller chiama un dispatcher che invia un payload a un lavoratore (eseguito sotto il poolboy) per elaborare il carico utile ricevuto in background.Come interrompere (o impedire l'esecuzione) di una chiamata a un operatore nel mio test ExUnit?
Nella mia prova di controllo, io in realtà non voglio testare la roba il lavoratore sta facendo, voglio solo sapere che il dispatcher per il lavoratore è stato chiamato con il carico utile corretto (ad es calledWith())
E idealmente la funzione del dispatcher da eliminare, quindi la cosa reale non viene mai eseguita.
Potrei passare un ulteriore parametro al dispatcher per assicurarmi che non esegua mai il codice sul lavoratore, ma ciò sembra molto disordinato, mentre uno stub sembra un'idea.
Grazie
Modifica
codice Dispatcher:
defmodule Convert.Dispatcher do
def dispatch(data) fo
spawn (fn() -> parallel(data) end)
end
def parallel(data) do
#pass off to poolboy
end
end
test di simulazione:
with_mock Convert.Dispatcher, [dispatch: fn(_opts) -> :ok end] do
response = conn(:post, "/", data) |> send_request
body = response.resp_body |> Poison.decode!
assert response.status == 201
assert called Convert.Dispatcher.dispatch("")
end
Fare attenzione ad andare in giro per una libreria di derisione prima di considerare altre opzioni. Impedisce l'esecuzione simultanea del test case (a causa della modifica globale del modulo), accoppia strettamente la tua implementazione, il che significa più lavoro quando devi scambiarlo con un altro modulo e introduce nuove dipendenze. Considera invece di iniettare le tue dipendenze, come in http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/ e https://medium.com/@lasseebert/mocks-in-elixir- 7204f8cc9d0f – Dennis