Почему Eunit настаивает на том, что моя функция возвращает {ok, value}, если это не так? - PullRequest
0 голосов
/ 01 февраля 2020

Я делаю что-то очень простое: переворачиваю список в Erlang без использования BIF.

Вот моя попытка:

%% -----------------------------------------------------------------------------
%% Reverses the specified list.
%% reverse(List) where:
%%   * List:list() is the list to be reversed.
%% Returns: A new List with the order of its elements reversed.
%% -----------------------------------------------------------------------------
reverse(List) ->
  reverse2(List, []).

%% -----------------------------------------------------------------------------
%% If there are no more elements to move, simply return the List
%% -----------------------------------------------------------------------------
reverse2([], List) -> 
  List;

%% -----------------------------------------------------------------------------
%% Taking the head of the List and placing it as the head of our new List
%% This will result in the first element becoming the last, the 2nd becoming
%% the second last, etc etc.
%% We repeat this until we arrive at the base case above
%% -----------------------------------------------------------------------------
reverse2([H|T], List) ->
  reverse2(T, [H|List]).

Теперь я считаю, что это правильно, и проверяю это на оболочке со случайными списками выдает правильный ответ каждый раз. Вот код, который я использую для запуска тестирования Eunit:

%% -----------------------------------------------------------------------------
%% Tests the reverse list functionality.
%% -----------------------------------------------------------------------------
reverse_test_() -> [
  {"Reverse empty list", ?_test(begin

    % Reverse empty list.
    ?assertEqual([], util:reverse([]))
  end)},
  {"Reverse non-empty list", ?_test(begin

    % Reverse non-empty list.
    ?assertEqual([5, 4, 3, 2, 1], util:reverse([1, 2, 3, 4, 5]))
  end)}
].

И это то, о чем мне говорит выполнение теста, в частности:

error:{assertEqual,[{module,util_test},
              {line,101},
              {expression,"util : reverse ( [ ] )"},
              {expected,[]},
              {value,{ok,[]}}]}
  output:<<"">>

Это то, что меня смущает Моя функция reverse никогда ничего не возвращает с ok, тестирование в терминале ничего не выводит с ok, но тестирование с использованием EUnit с другой стороны, похоже, возвращает {ok, value}

1 Ответ

3 голосов
/ 02 февраля 2020

На самом деле код выглядит хорошо. Может быть, у вас есть какая-то другая функция reverse/1 в util.erl, что пытается вернуть {ok, Value}. Попробуйте обновить свои тесты без указания util::

%% -----------------------------------------------------------------------------
%% Tests the reverse list functionality.
%% -----------------------------------------------------------------------------
reverse_test_() -> [
  {"Reverse empty list", ?_test(begin

    % Reverse empty list.
    ?assertEqual([], reverse([]))
  end)},
  {"Reverse non-empty list", ?_test(begin

    % Reverse non-empty list.
    ?assertEqual([5, 4, 3, 2, 1], reverse([1, 2, 3, 4, 5]))
  end)}
].
...