2015-10-22 2 views
2

Je veux que ce dans un module superviseur:Pouvez-vous mock erlang: sortie?

donc un test naïf pourrait faire:

stop_invokes_exit_test() -> 
    meck:new(erlang, [unstick, passthrough]), 
    meck:expect(erlang, whereis, 1, a_pid), 
    meck:expect(erlang, exit, 2, true), 
    mousetrap_sup:stop(), 
    ?assert(meck:called(erlang, exit, [a_pid, kill])). 

Sans surprise, il se bloque.

Je peux voir où il pourrait ne pas être possible d'exercer ce code avec un test, mais y a-t-il un moyen?

Répondre

4

Vous pouvez lancer un processus en utilisant ce nom, et vérifiez la raison de la sortie:

{Pid, Ref} = spawn_monitor(timer, sleep, [infinity]), 
register(my_sup, Pid), 
mousetrap_sup:stop(), 
receive 
    {'DOWN', Ref, process, Pid, Reason} -> 
     ?assertEqual(killed, Reason) 
after 1000 -> 
    error(not_killed) 
end. 
+0

Cela a fait l'affaire. Merci! –

7

De la documentation meck

Meck aura du mal à se moquant de certains modules depuis Meck fonctionne par recompiler et modules rechargeant. Puisque Erlang a un espace de noms de module à plat, le remplacement d'un module doit être fait globalement dans la machine virtuelle Erlang. Cela signifie que certains modules ne peuvent pas être moqués. Voici une liste non exhaustive des modules qui peuvent être soit problématique pour se moquer ou pas possible du tout:

  • Erlang
  • os
  • Crypto
  • compilez
  • global

Donc non, vous ne pouvez pas simuler la sortie. Vous pouvez, cependant, envelopper l'appel de sortie dans une autre fonction et balayer cette fonction.