0

私は次のモジュールを持っています

-module(bhavcopy_downloader).

-export([download/2]).

download(From, SaveTo) ->
    {ok, {{Status, _}, _, Body}} = lhttpc:request(From, "GET", [], infinity),
    case Status of 
        200 ->  file:write(SaveTo, Body),
            true;
        _ -> false
    end.

そして、上記のコードの次のテスト

file_download_test_() -> 
    {foreach,
     fun() ->
            meck:new(lhttpc)
            meck:new(file, [unstick])
     end,
     fun(_) ->
        meck:unload(file),
            meck:unload(lhttpc) 
     end,
      {"saves the file at specified location",
        fun() ->
            meck:expect(lhttpc, request, 4, {ok, {{200, "OK"}, [], <<"response">>}}),
            meck:expect(file, write_file, fun(Path, Data) -> 
                                    ?assertEqual(Path, "~/Downloads/data-downloader/test.html"), 
                                    ?assertEqual(Data, <<"response">>) 
                            end),
            ?assertEqual(true, bhavcopy_downloader:download("http://google.com", "~/Downloads/data-downloader/test.html")),
            ?assert(meck:validate(file))
        end}]

    }.

テストを実行すると、次のエラーが発生します(簡潔にするために、エラーの一部のみを以下に貼り付けました)。以下のエラーを見ると、ファイルモジュールがモックされていない(または、を使用して他のモックを設定したときにファイルモジュールのモックが上書きされている)と感じていますmeck:new(lhttpc)。ここで何が問題になっている可能性がありますか?

=ERROR REPORT==== 16-Feb-2013::20:17:24 ===
** Generic server file_meck terminating 
** Last message in was {'EXIT',<0.110.0>,
                    {compile_forms,
                     {error,
                      [{[],
                        [{none,compile,
                          {crash,beam_asm,
                           {undef,
                            [{file,get_cwd,[],[]},
                             {filename,absname,1,
                              [{file,"filename.erl"},{line,67}]},
                             {compile,beam_asm,1,
                              [{file,"compile.erl"},{line,1245}]},
                             {compile,'-internal_comp/4-anonymous-1-',2,
                              [{file,"compile.erl"},{line,273}]},
                             {compile,fold_comp,3,
                              [{file,"compile.erl"},{line,291}]},
                             {compile,internal_comp,4,
                              [{file,"compile.erl"},{line,275}]},
                             {compile,'-do_compile/2-anonymous-0-',2,
                              [{file,"compile.erl"},{line,152}]}]}}}]}],
                      [{"src/lhttpc_types.hrl",
                        [{31,erl_lint,{new_builtin_type,{boolean,0}}},
                         {31,erl_lint,{renamed_type,bool,boolean}}]}]}}}
4

1 に答える 1

2

これはMeckのキャッチ22です。これは、MeckがErlangコンパイラーを使用し、Erlangコンパイラーがfileモジュールを使用するためです。Meckがモジュールを再コンパイルしようとすると、 (コンパイラを介して)モジュールfileが必要になるfileため、クラッシュします。

現時点では、Meckはファイルモジュールのモックを処理していません。最善の代替策は、fileモジュール呼び出しを別のモジュールでラップし、代わりにこのモジュールをモックすることです。

たとえば、コンパイラとコードサーバーの内部を代わりに使用することで、Meckでこれを修正することは理論的には可能ですが、erlang:load_module/2これは非常にトリッキーであり、適切に設計およびテストする必要があります)

于 2013-02-26T18:32:56.053 に答える