2016-01-20 58 views
0

我刚开始学习Elixir。 我试图用espec测试异常(https://github.com/antonmi/espec),并且我被困住了。使用espec在Elixir应用程序中测试异常

这里是我的功能

defp call_xml(request_body) do 
resp = HTTPotion.post("http://foo.bar", [body: request_body, headers: ["Content-Type": "text/xml"]]) 
if resp.status_code in [200, 201] do 
    {:ok, elem(XMLRPC.decode(resp.body), 1).param} 
else 
    raise AbpError, message: "Message body" 
end 
end 

def create_some_stuff(a, b, c) do 
req = %XMLRPC.MethodCall{method_name: "Foo.Bar", 
          params:[a, b, c]} |> XMLPRC.encode! 
call_xml(req) 
end 

# tests 

use ESpec 
use HyperMock 
import :meck 

context "when exception rised" do 
it "returns err message" do 
    # stubbed with :meck 
    expect(MyModule, : create_some_stuff, fn("foo", "bar", "baz") -> raise CustomError end) 
    expect(MyModule. create_some_stuff("foo", "bar", "baz")).to eq("???") 
end # it 
end 

在这种情况下,我得到我期望

** (AbpError) Error occured! 
spec/lib/ex_abpclient_spec.exs:135: anonymous fn/7 in ExAbpclientSpec.example_returns_created_payback_eqcpjlrszudikwyovtmxbgfnha/1 
(ex_abpclient) ExAbpclient.create_payment_payback("tr-TR", 10966, 10, "R", 495, 10, "DESC") 
spec/lib/ex_abpclient_spec.exs:136: ExAbpclientSpec.example_returns_created_payback_eqcpjlrszudikwyovtmxbgfnha/1 
(espec) lib/espec/example_runner.ex:33: ESpec.ExampleRunner.run_example/2 
(elixir) lib/enum.ex:1088: Enum."-map/2-lists^map/1-0-"/2 
(elixir) lib/enum.ex:1088: Enum."-map/2-lists^map/1-0-"/2 
(espec) lib/espec/runner.ex:70: ESpec.Runner.run_examples/1 
(espec) lib/espec/runner.ex:43: ESpec.Runner.do_run/2 

我怎样才能存根异常引发的错误? 在此先感谢。

UPDATE

我试图用HyperMock(https://github.com/stevegraham/hypermock)存根要求,但没有运气太

context "when payback created" do 
    it "returns created payback" do 
    HyperMock.intercept do 
     request = %Request{body: "<?xml version=\"1.0\" encoding=\"UTF-8\"?><methodCall>.....", 
         headers: ["Content-Type": "text/xml"], 
         method: :post, 
         uri: "http://foo.bar/webApiXmlRpcServlet"} 
     response = %Response{body: "fooooo", status: 500} 
     stub_request request, response 
     expect MyModule.create_some_stuff("a", "b", "c") |> to(raise_exception AbpError, "fooooo") 
    end 
    end # it 
end # exception 

下面是结果

/Users/retgoat/workspace/offside/ex_abpclient/spec/lib/ex_abpclient_spec.exs:135 
** (AbpError) Error: "fooooo" 
(ex_abpclient) lib/ex_abpclient.ex:55: ExAbpclient.call_xml/1 
spec/lib/ex_abpclient_spec.exs:143: ExAbpclientSpec.example_returns_created_payback_nqfwohpurlvtzskdjxigeybamc/1 
(espec) lib/espec/example_runner.ex:33: ESpec.ExampleRunner.run_example/2 
(elixir) lib/enum.ex:1088: Enum."-map/2-lists^map/1-0-"/2 
(elixir) lib/enum.ex:1088: Enum."-map/2-lists^map/1-0-"/2 
(espec) lib/espec/runner.ex:70: ESpec.Runner.run_examples/1 
(espec) lib/espec/runner.ex:43: ESpec.Runner.do_run/2 
(espec) lib/espec/runner.ex:28: ESpec.Runner.handle_call/3 


10 examples, 1 failures 

Finished in 1.28 seconds (0.14s on load, 1.14s on specs) 

例外是惜售,但我无法测试它。

回答

2

Roman! 您必须将函数传递给expect,而不是函数调用的结果。 所以,只是包装MyModule.create_some_stuff("a", "b", "c")通过fn -> end就像你在ExUnit expample做: elixir it "raises exception" do expect(fn -> MyModule.create_some_stuff("a", "b", "c") end) |> to(raise_exception AbpError, "fooooo") end

+0

安东,非常感谢!工作就像一个魅力:) – retgoat