首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏内部使用ExUnit.Assertions

宏内部使用ExUnit.Assertions
EN

Stack Overflow用户
提问于 2018-02-20 05:57:34
回答 1查看 131关注 0票数 0

我为测试用例编写了一个小宏。

代码语言:javascript
复制
    defmodule ControllerTest do
      @required [:phone, :country]
      defmacro create(fields) do
        quote do
          without = length(unquote(@required) -- unquote(field)
          if without != 0 do
            Enum.map(unquote(@required), fn(field) ->
              member = Enum.member?(unquote(fields), field)
              if member == false do
                expected_error = String.to_atom(Atom.to_string(field) <> " " <> "can't be blank")
                expected = {:error, expected_error}
               assert expected == {:error, expected_error} 
              end
            end)
          else
            expect = {:success, "Record created"}
            assert expect == {:success, "Record created"}
          end
        end
      end
     end

它在没有断言的情况下工作良好。但是,当我尝试使用assert时,它说assert是未定义的。我已经在模块中尝试了import ExUnit.Assertions,但是仍然没有定义相同的assert

在宏中使用断言可能的解决方案是什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-20 07:28:07

在使用import之前,需要在quote中添加assert。在quote之前添加它不会使assertquote中可用。

代码语言:javascript
复制
defmacro create(fields) do
  quote do
    import ExUnit.Assertions
    without = ...
    ...
  end
end

此外,您的Enum.map也可以简化如下:

代码语言:javascript
复制
for field <- unquote(@required), field not in unquote(fields) do
  expected_error = String.to_atom(Atom.to_string(field) <> " " <> "can't be blank")
  expected = {:error, expected_error}
  assert expected == {:error, expected_error} 
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48878761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档