Как обрабатывать различные логические значения в Perl? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть существующая функция, которая проверяет, определена ли входная переменная, и возвращает true, если она равна другой переменной, и возвращает false в противном случае:

sub isVar1Valid {
    my ($self, $var1) = @_;
    my $var2 = "someValue";   
    return $var1 && $var1 eq $var2;
}

Я пишу модульные тесты для этогофункция, и ожидаемый результат, который я ищу, ложен.В моем модульном тесте я на самом деле тестирую на 0.Однако мой тест не пройден, потому что приведенный выше метод возвращает ' ', а это не равно 0.

Мой модульный тест выглядит примерно так:

my $actualOutput = isVar1Valid($input);
is($actualOutput, 0);

Должен ли ятестировать ' ' как ожидаемый результат в моем модульном тесте?Или я должен вместо этого возвращать 0 в своей основной функции?

Я впервые работаю с Perl, поэтому любые указания приветствуются.

1 Ответ

4 голосов
/ 27 июня 2019

Если $var1 ложно, подпрограмма вернет значение $var1.

Если $var1 истина, но отличается от $var2, подпрограмма вернет скаляр, содержащийцелое число 0, число с плавающей точкой 0 и пустая строка.

Но я бы не стал явно проверять какие-либо из этих значений.Все они являются законными ценностями, и их слишком сложно проверить для каждого.

Вместо этого вы должны нормализовать.

is(isVar1Valid($input) ? 1 : 0, 0);

Еще лучше, используйте ok вместо is.

ok(!isVar1Valid($input));

Кстати,обратите внимание, что следующая конструкция немного странна:

$var1 && $var1 eq $var2

Цель первой проверки, вероятно, состоит в том, чтобы избежать "неинициализированного" предупреждения.Если это так, то лучше сообщить об этом читателю, используя вместо этого следующее:

defined($var1) && $var1 eq $var2

Это важно, поскольку вторая версия не эквивалентна второй, если $var2 может быть ложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...