Как проверить, содержит ли строка другую строку в PHPUnit?


Кажется, я не могу найти утверждение в Пхпунит это просто проверяет, содержится ли строка где-то в другой строке. Пытаюсь сделать что-то вроде этого:

public function testRecipe() {

    $plaintext = get_bread_recipe();

    $this->assertStringContains('flour', $plaintext);

}

Какое реальное утверждение я бы поставил вместо assertStringContains? Я бы предпочел не беспокоиться о регулярных выражениях в этом случае, потому что в этом нет абсолютно никакой необходимости.

Это так просто, что должно быть что-то, что я упустил из виду, но я просто не могу этого понять! Достаточно забавно, что есть assertStringStartsWith() и assertStringEndsWith()!

Обновление: Я знаю, что strpos() !== false можно было бы использовать, но я ищу что-то более чистое. Если я все равно просто использую ванильные функции PHP, в чем тогда весь смысл со всеми утверждениями...

 43
Author: TheStoryCoder, 2014-06-03

6 answers

Как вы могли бы сказать, assertContains предназначен для проверки того, что массив содержит значение.

Чтобы узнать, содержит ли строка подстроку, самым простым запросом было бы использовать assertregexp()

$this->assertRegexp('/flour/', $plaintext);

Вам просто нужно будет добавить разделители.

Если вы действительно хотите иметь утверждение assertStringContains, вы можете расширить PHPUnit_Framework_TestCase и создать свое собственное.

ОБНОВЛЕНИЕ

В последней версии PHPUnit assertContains будет работать со строками.

 46
Author: Schleis, 2015-07-22 13:29:34

Вы всегда можете скрыть уродство внутри пользовательского метода утверждения, поэтому в основном у меня был бы класс BaseTestCase, который наследуется от тестового случая phpunit, который вы могли бы использовать для создания собственной библиотеки многократно используемых утверждений (см. http://xunitpatterns.com/Custom%20Assertion.html ).. (В php 5.4 вы также можете использовать черты, библиотеки утверждений imho - один из случаев, когда черты действительно полезны)..Я всегда привожу довольно много пользовательских утверждений в своих проектах, часто специфичный для домена. И да, некоторые тоже уродливы:) Ну, я думаю, для этого и существует инкапсуляция... Среди прочего...:)

ОБНОВЛЕНИЕ: Я только что проверил, и "Assertcontains" и "assertnotcontains" на самом деле также работают со строками, а также с массивами (и со всем, что реализует "Проходимость"):

function test_Contains()
{
    $this->assertContains("test", "this is a test string" );
    $this->assertNotContains("tst", "this is a test string");
}
 66
Author: malte, 2014-06-04 09:16:33

Не можете ли вы просто выполнить строку в строке, используя доступные простые функции PHP, а затем подтвердить вывод этого? Конечно, это не так блестяще, но это работает.

В качестве альтернативы вы можете использовать assertThat с регулярным выражением.

Похоже, что что-то изначально не так с дизайном кода/теста, хотя с ограниченной точки зрения примера. Почему функция возвращает сложную строку неизвестной длины с ожидаемым битом "где-то" в веревочка?

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

 0
Author: hermitcodemonkey, 2014-06-03 13:16:52

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

Убедитесь, что вы проверяете значение FALSE, а не что-то, что оценивается как FALSE, например 0 (именно это вернет strpos, если проверяемая строка начинается с заданной подстроки).

 0
Author: GordonM, 2014-06-03 13:21:43

Начиная с @Schleis, если у вас есть более сложные строки, вам нужно будет избежать регулярного выражения:

$this->assertRegexp('/' . preg_quote('[some $stuff]') . '/', $plaintext);

Или оберните его более аккуратным способом:

public function assertStringContains($needle, $haystack)
{
    $this->assertRegexp('/' . preg_quote($needle) . '/', $haystack);
}
 0
Author: Elliot Chance, 2015-06-30 03:27:33
if (strpos($plaintext, 'flour') === false){
   $this->fail("planintext should contain 'flour'");
}
 -1
Author: Farid Movsumov, 2014-06-03 13:24:07