2

我正在使用 Erlang 的EUnit对应用程序进行单元测试。

我想断言某个测试值在 2 和 3 之间。 没有内置支持 this,所以我尝试使用一对防护,如下所示:

myTestCase ->
  ?assertMatch({ok, V} when V>2, V<3,
               unitUnderTest() % expected to return 2.54232...
  ).

这会尝试对andalso.

但是,这不起作用,大概是因为 Erlang 的解析器无法区分assertMatch. 我尝试将各种东西用括号括起来,但没有找到任何有用的东西。另一方面,当我将表达式简化为一个子句时,它成功了。

有没有办法在这里表达多个子句?

4

2 回答 2

2

您不能在语法中使用逗号,因为 ?assertMatch 被解释为具有 3 个或更多参数的宏,并且没有对此的定义。但是语法 andalso 和 orelse 有效。你为什么不使用:

fok() -> {ok,2.7}.

fko() -> {ok,3.7}.

myTestCase(F) ->
    F1 = fun() -> apply(?MODULE,F,[]) end,
    ?assertMatch({ok, V} when V>2 andalso V<3, F1()).

测试:

1> c(test).
{ok,test}
2> test:myTestCase(fok).
ok
3> test:myTestCase(fko).
** exception error: {assertMatch,
                        [{module,test},
                         {line,30},
                         {expression,"F1 ( )"},
                         {pattern,"{ ok , V } when V > 2 andalso V < 3"},
                         {value,{ok,3.7}}]}
     in function  test:'-myTestCase/1-fun-1-'/1 (test.erl, line 30)
4>
于 2017-05-27T10:03:35.773 回答
1

但是,这不起作用,大概是因为 Erlang 的解析器无法区分 assertMatch 的多个守卫和多个参数之间的区别

eunit文档明确警告了这一点:

assertMatch(GuardedPattern, Expr)

GuardedPattern 可以是任何你可以写在 case 子句中 -> 符号左侧的东西,但它不能包含逗号分隔的保护测试。

怎么样:

-module(my).
-compile(export_all).
-include_lib("eunit/include/eunit.hrl").

f() ->
    {ok, 3}.


f_test() ->
    ?LET({ok, X}, f(), ?assertMatch( true, X>2 andalso X<4 ) ).
于 2017-05-27T05:47:15.990 回答