2017-08-08 1 views
2

Je voudrais être en mesure de mettre en place progressivement un simulacre (en utilisant Meck), de sorte que les attentes pour différents appels soient définies dans différentes fonctions de configuration de test. Je pensais que merge_expects pourrait faire l'affaire. Mais je vois des résultats inattendus:Comment puis-je configurer progressivement un simulacre à l'aide de Meck?

default__second_expect_overwrites_first_expect_test() -> 
    meck:unload(), 
    meck:new(womble, [non_strict]), 

    meck:expect(womble, sleep, fun(8) -> ok end), 
    meck:expect(womble, sleep, fun(24) -> comatose end), 

    ?assertEqual(comatose, womble:sleep(24)), 
    ?assertError(function_clause, womble:sleep(8)). 

merge_expects__second_expect_has_no_effect_test() -> 
    meck:unload(), 
    meck:new(womble, [non_strict, merge_expects]), 

    meck:expect(womble, sleep, fun(8) -> ok end), 
    meck:expect(womble, sleep, fun(24) -> comatose end), 

    ?assertError(function_clause, womble:sleep(24)), 
    ?assertEqual(ok, womble:sleep(8)). 

Je sais que je peux utiliser la solution suivante, mais cela enlaidir mes tests:

workaround_test() -> 
    meck:unload(), 
    meck:new(womble, [non_strict]), 

    meck:expect(womble, sleep, [{[8], ok}, {[24], comatose}]), 
    ?assertEqual(comatose, womble:sleep(24)), 
    ?assertEqual(ok, womble:sleep(8)). 

Répondre

1

Cela semble être un « bug » liés à l'utilisation funs en tant que spécifications d'attentes (je pense qu'il n'a jamais été soutenu en premier lieu, mais en tout cas il n'est pas clairement documenté). Comme solution de contournement, vous pouvez utiliser expect/4:

1> meck:new(womble, [non_strict, no_link, merge_expects]). 
ok 
2> meck:expect(womble, sleep, [24], comatose). 
ok 
3> womble:sleep(8). 
** exception error: no function clause matching womble:sleep(8) 
4> womble:sleep(24). 
comatose 
5> meck:expect(womble, sleep, [8], ok). 
ok 
6> womble:sleep(8). 
ok 
7> womble:sleep(24). 
comatose 
+0

a confirmé que le corrige - merci Adam. Le seul endroit où je pourrais continuer à utiliser 'expect/3' est de créer un simulacre comme ceci:' meck: attendez (m2, mult42, fun (X) -> X * 42 end). ' – MrBlueSky

+0

clauses de fonction est difficile, car ils peuvent avoir des gardes. Ceci n'est pas implémenté dans Meck actuellement. –