EUnit的assertMatch中的多个子句?

时间:2017-05-27 03:52:33

标签: erlang eunit

我正在使用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的多个参数。我尝试在括号中包装各种东西,但没有找到任何有用的东西。另一方面,当我将表达式简化为一个子句时,它就会成功。

有没有办法在这里表达多个条款?

2 个答案:

答案 0 :(得分:1)

  

然而,这不起作用,大概是因为Erlang的解析器不能   告诉多个警卫和多个参数之间的区别   assertMatch

eunit docs明确警告:

  

CREATE VIEW EMPJOBS AS SELECT e.employee_id AS ENUM, CONCAT(e.first_name, ' ' , e.last_name) AS NAME, e.email AS EMAIL, COUNT(j.end_date) AS FINISHEDJOBS FROM EMPLOYEE e inner join JOBHISTORY j on j.employee_id = e.employee_id group by e.employee_id ,CONCAT(e.first_name,' ', e.last_name) ,e.email;

     

GuardedPattern可以是您可以在左侧书写的任何内容    - &gt;的一面case子句中的符号,但不能包含   以逗号分隔的守卫测试。

怎么样:

assertMatch(GuardedPattern, Expr)

答案 1 :(得分:1)

你不能在语法中使用逗号,因为那时?assertMatch被解释为具有3个或更多参数的宏,并且没有定义。但语法和其他方法都有效。为什么不使用:

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>