2017-08-08 3 views
2

私は漸進的に(Meckを使用して)擬似を設定できるようにしたいので、さまざまな呼び出しの期待が異なるテスト設定機能で設定されています。私はmerge_expectsがそのトリックをするかもしれないと思った。しかし、私は、予期しない結果を見ています: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)). 

私は次の回避策を使用することができることを知っているが、それは私のテストをuglifyます:

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

答えて

1

これは低速運行の使用に関連する「バグ」のようです(私はそれが最初にサポートされたとは思えませんでしたが、いずれにしても明確に文書化されていません)。この問題を回避するには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

Adamに感謝します。私が 'expect/3'を使いたい場所を知っている唯一の場所は、' meck:expect(m2、mult42、fun(X) - > X * 42 end) 'のようなモックを設定することです。 – MrBlueSky

+0

関数節はガードを持つことができるため、扱いにくいです。これはMeckでは現在実装されていません。 –