EUnit 的 assertMatch 中的多个子句?
Multiple clauses in EUnit's assertMatch?
我正在使用 Erlang 的 EUnit 对应用程序进行单元测试。
我想断言某个测试值在2到3之间。There's no built-in support for this,所以我尝试使用一对守卫,像这样:
myTestCase ->
?assertMatch({ok, V} when V>2, V<3,
unitUnderTest() % expected to return 2.54232...
).
这会尝试将 guard syntax 用于 andalso
。
然而,这不起作用,大概是因为 Erlang 的解析器无法区分 assertMatch
的多个守卫和多个参数之间的区别。我尝试用括号括起各种东西,但没有找到任何有用的东西。另一方面,当我将表达式缩减为一个子句时,它成功了。
有没有办法在这里表达多个子句?
However, this does not work, presumably because Erlang's parser can't
tell the difference between multiple guards and multiple arguments to
assertMatch
eunit docs 明确警告:
assertMatch(GuardedPattern, Expr)
GuardedPattern can be anything that you can write on the left hand
side of the -> symbol in a case-clause, except that it cannot contain
comma-separated guard tests.
怎么样:
-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 ) ).
您不能在语法中使用逗号,因为那样的话 ?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>
我正在使用 Erlang 的 EUnit 对应用程序进行单元测试。
我想断言某个测试值在2到3之间。There's no built-in support for this,所以我尝试使用一对守卫,像这样:
myTestCase ->
?assertMatch({ok, V} when V>2, V<3,
unitUnderTest() % expected to return 2.54232...
).
这会尝试将 guard syntax 用于 andalso
。
然而,这不起作用,大概是因为 Erlang 的解析器无法区分 assertMatch
的多个守卫和多个参数之间的区别。我尝试用括号括起各种东西,但没有找到任何有用的东西。另一方面,当我将表达式缩减为一个子句时,它成功了。
有没有办法在这里表达多个子句?
However, this does not work, presumably because Erlang's parser can't tell the difference between multiple guards and multiple arguments to assertMatch
eunit docs 明确警告:
assertMatch(GuardedPattern, Expr)
GuardedPattern can be anything that you can write on the left hand side of the -> symbol in a case-clause, except that it cannot contain comma-separated guard tests.
怎么样:
-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 ) ).
您不能在语法中使用逗号,因为那样的话 ?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>