web-dev-qa-db-ja.com

文字列にPHPUnitの別の文字列が含まれているかどうかをテストするにはどうすればよいですか?

PHPUnit には、文字列が別の文字列のどこかに含まれているかどうかを単純にテストするアサーションが見つかりません。このようなことをしようとしています:

_public function testRecipe() {

    $plaintext = get_bread_recipe();

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

}
_

assertStringContainsの代わりにどのような実際のアサーションを追加しますか?この場合、絶対に必要ないので、正規表現について心配する必要はありません。

それはとても単純なので、私が見落としているものがあるに違いありませんが、私はそれを理解することができません!面白いことに、assertStringStartsWith()assertStringEndsWith()があります!

更新:strpos() !== falseが使用できることは知っていますが、もっときれいなものを探しています。とにかくVanilla PHP関数を使用する場合、すべてのアサーションのポイントは何ですか...

57
TheStoryCoder

assertContainsは、配列に値が含まれていることを確認するためのものです。

文字列に部分文字列が含まれているかどうかを確認するための最も簡単なクエリは、 assertRegexp() を使用することです。

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

区切り文字を追加するだけです。

本当にassertStringContainsアサーションが必要な場合は、PHPUnit_Framework_TestCaseそして、独自に作成します。

[〜#〜] update [〜#〜]

PHPUnitの最新バージョンでは、assertContainsは文字列に対して機能します。

64
Schleis

いつでもカスタムアサーションメソッド内のさを隠すことができるので、基本的には、再利用可能なアサーションの独自のライブラリを使用するために使用できるphpunitテストケースを継承するBaseTestCaseクラスがあります( http:// xunitpatterns .com/Custom%20Assertion.html )..(PHP 5.4では、特性も使用できます。imhoアサーションライブラリは、特性が実際に役立つ場合の1つです)。多くの場合、ドメイン固有の私のプロジェクト。そして、はい、いくつかはいです:)まあ、それはカプセル化がそこにあるものだと思います...とりわけ......)

UPDATE:チェックしたばかりで、「assertContains」と「assertNotContains」は実際には文字列と配列(および「Traversable」を実装するもの)でも動作します。

function test_Contains()
{
    $this->assertContains("test", "this is a test string" );
    $this->assertNotContains("tst", "this is a test string");
}
73
malte

使用可能なプレーンPHP関数を使用してstring内の文字列を実行し、その出力をassertEqualsにすることはできませんか?.

あるいは、正規表現でassertThatを使用できます。

例の限られた観点からは、コード/テストの設計に本質的に何かが間違っているように聞こえます。なぜ関数は、文字列の「どこか」に予期されるビットを持つ未知の長さの複雑な文字列を返すのでしょうか?

テストでは、入力を制御できる必要があります。そのため、予想される出力文字列全体を知る必要があります。関数が文字列の他の部分を台無しにした場合、このアサーションだけでは文字列がわかりません。これがおそらくassertStringContains関数が存在しない理由です。

0

2019およびPHPUnit 8.0の更新

assertContains()はPHPUnit 8.0以降では非推奨です。 issue#3425 を参照してください。


特定の方法が推奨されるようになりました( issue #3422 ):

$this->assertStringContainsString('flour', $plaintext);
0
Tomáš Votruba

Vanilla PHP関数を含む。あらゆるものに対してアサーションを行うことができます。テストしているストリングで関心のあるサブストリングのstrposがFALSEを返さないことをアサートすると、ニーズ。

ただし、0などのFALSEに評価されるもの(テスト対象の文字列が指定された部分文字列で始まる場合にstrposが返すもの)ではなく、FALSEに対してチェックしていることを確認してください。

0
GordonM

@Schleisから拡張し、より複雑な文字列がある場合は、正規表現をエスケープする必要があります。

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

または、よりきれいな方法でそれをまとめます:

public function assertStringContains($needle, $haystack)
{
    $this->assertRegexp('/' . preg_quote($needle) . '/', $haystack);
}
0
Elliot Chance