16

次のシナリオを検討してください (これは製品コードではありません)。

 class MyClass {
    public function myMethod() {
        // create a directory
        $path = sys_get_temp_dir() . '/' . md5(rand());
        if(!mkdir($path)) {
            throw new Exception("mkdir() failed.");
        }

        // create a file in that folder
        $myFile = fopen("$path/myFile.txt", "w");
        if(!$myFile) {
            throw new Exception("Cannot open file handle.");
        }
    }
}

右、それで問題は何ですか?コード カバレッジは、この行がカバーされていないことを報告します。

throw new Exception("Cannot open file handle.");

これは正しいですが、上記のフォルダーを論理的に作成しているため、失敗することは不可能に思えますfopen()(ディスクが 100% のような極端な状況を除いて)。

コード カバレッジからコードを無視することもできますが、それは一種の不正行為です。myFile.txtファイルを作成できないファイルシステムを認識してモックできるように、ファイルシステムをモックする方法はありますか?

4

3 に答える 3

13

vfsStream単体テストで実際のファイルシステムを模擬するのに役立つforstream wrapperです。composervirtual filesystemからインストールできます。

詳細情報:

https://github.com/mikey179/vfsStream

https://phpunit.de/manual/current/en/test-doubles.html

于 2012-08-23T00:23:03.967 に答える
3

関数を 2 つのメソッドに分割することもできます。1 つはパスを作成し、もう 1 つはそれを使用します。次に、個々のテストを実行して、パスが作成されたことを確認できます。2 番目のテスト セットでは、不適切なパスを使用しようとしたときに、例外をチェックしてキャプチャできます。

于 2012-08-28T20:03:44.870 に答える
2

はい!

何らかの形でフルパスを挿入する必要があり、そのメソッドで sys_get_temp_dir() を呼び出さないでください。

存在しないパスがあると、問題が発生します。そのためにVFSは必要ありません。

ただし、例外がトリガーされる前に E_NOTICE (またはおそらく警告?) が表示されます。そのため、最初に is_writable を確認し、false が返された場合は例外をスローする必要があります。

于 2012-08-23T00:23:42.027 に答える