問題タブ [vfs-stream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
3137 参照

php - VFSStream でファイルシステム操作をテストしようとしています

vfsStream を使用してファイルシステム操作 (実際には php://input からの読み取り) をモックしようとしていますが、適切なドキュメントと例の欠如が本当に妨げになっています。

私がテストしているクラスの関連コードは次のとおりです。

PHPUnit テストで使用しているセットアップは次のとおりです。

実際のテスト (getHandle() を間接的にトリガーするメソッドを呼び出す) では、VFS をセットアップして、次のようにアサーションを実行しようとします。

これにより、テストがハングするだけです。

明らかに、私はここで非常に間違ったことをしていますが、ドキュメントの状態を考えると、私が何をしようとしているのか理解できません。これは vfsstream によって引き起こされたものですか、それとも phpunit がここで確認する必要があるものを模倣しているのでしょうか?

0 投票する
3 に答える
12397 参照

php - PHPUnit: このファイル システムをモックするにはどうすればよいですか?

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

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

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

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

0 投票する
2 に答える
198 参照

php - テストメソッドが1つしかない場合のテストパス

以下のテストの1つをコメントアウトすると、テストに合格します。ただし、両方を一緒に実行すると、最後の1つは失敗します(テストの順序を変更しても):

プロダクションコード:

テストクラス:

テスト出力:

それは私には意味がありません。私は何が欠けていますか?

0 投票する
1 に答える
296 参照

php - vsfStream と PHP ユニットでのテスト

そのため、私は現在単体テストを取り上げており、旅の途中で、ファイル システムやデータベース クエリなどをモックする必要があるかもしれないことを発見しました。

vfsStream はファイル システムをモックするための優れたライブラリであるという PHPUnit ドキュメントの推奨事項を読みました。

とはいえ、使い方に問題があります。

GitHub でホストされている wiki で提供されているドキュメントに従っているにもかかわらず、セットアップ方法がよくわかりません。

ファイル システムの対話を、適切な名前のメソッドを使用して独自のクラスに抽象化しました。ファイルシステムをモックしていないときは、意図したとおりに機能していたので、それは当面の問題ではないようです。

テストのセットアップ方法は次のとおりです。

ディレクトリの作成をテストするために書いたテストの例を次に示します。

これまでのところうまくいっているようです。ただし、次のテストは失敗します。

ドキュメントからわかる限り、これは機能するはずですが、明らかに私の読み方は正しくなく、どこかで道に迷っています。

私は何度も何度も行を変更してきましたが、私の人生ではそれを理解することができないので、この問題を解決する方法についてのヒント。

前もって感謝します!

0 投票する
1 に答える
177 参照

php - php vfsStreamが改行文字を解析していません

ここから vsf-stream を使用して、csv ファイルで動作するメソッドを分離して単体テストしようとしています: https://github.com/mikey179/vfsStream

テスト用に 2 次元データ配列を作成しましたが、これをモック ファイルに追加しようとすると、新しい行を追加する代わりに、改行文字を解析するようです。両方試しましたがfputcsvfputsどちらも同じ結果です。通常のファイルに正常に書き込むことができる同じデータとphp関数を使用すると、問題はvfs-streamにあるようです。ネット上にはあまりドキュメントがなく、完全に失われました:

上記のコードはモック ファイルを生成しますが、改行文字がないため、テストの後半でモック csv ファイルを解析しても、すべてが 1 つの長い行に記述されているように見えるため、機能しません。

生成されます:

私はこれのフラグがなく、バグではないことを願っています。どんな助けでも感謝します、乾杯。

0 投票する
2 に答える
1599 参照

php - vfsstream パスと realpath

ファイルシステムの相互作用の単体テストのために vfsStream を試していますが、すぐに大きなハードルにぶつかりました。テスト対象のコードが行う検証チェックの 1 つは、提供された入力パスに対して realpath() を実行して、それが実際のパスであり、ナンセンスではないことをテストすることです。ただし、realpath は vfsstream パスでは常に失敗します。

次のコードは、特定のクラス以外の問題を示しています。

出力は次のとおりです。

明らかに、vfsStream がファイルを作成し、指定されたコンテンツを書き込みましたが、そのパスが realpath で正しいことを確認できません。realpath は実際のコード内で使用されているため、これに対処する方法が必要です。

コード内で重要な機能を実行するため、realpath を削除することは賢明なアプローチではないと思います。コードをテスト可能にするためだけに重要なチェックを削除するのは、かなり貧弱な解決策のようです。テスト目的で無効にできるように、テストの周りに if を配置することもできますが、これも良い考えではないと思います。また、realpath () を呼び出す可能性のあるコード内のすべてのポイントでそれを行う必要はありません。3 番目のオプションは、ファイル システムの単体テスト用に RAM ディスクをセットアップすることですが、これも理想的ではありません。自分でクリーンアップする必要があり (これは vfsstream がその必要性を回避するのに役立つはずです)、実際にそれを行う方法は OS ごとに異なるため、単体テストは OS に依存しなくなります。

実際にリアルパスで動作する形式で vfsstream パスを取得する方法はありますか?

完全を期すために、以下は実際にテストしようとしているクラスのコード フラグメントです。

次のリファクタリング (考えられる解決策 2 による) により、vfsStream でテストできますが、本番環境では問題になる可能性があると思います。

0 投票する
1 に答える
999 参照

unit-testing - PHP ユニット テストとファイル システムのモックを作成する scandir()

ディレクトリをスキャンし、すべてのサブディレクトリの配列を作成するクラスにメソッドがあります。それは非常にシンプルで、うまく機能します。ただし、このメソッドの単体テストを追加したいのですが、方法を理解するのに苦労しています。

ここに私の問題があります: vfsstream を使用して仮想ファイル システムを作成でき、正常に動作します。ただし、それをクラスに渡して配列を作成することはできません。スキャンするには実際のディレクトリが必要です。管理されたディレクトリに対してテストしたい(明らかに、すべてのスキャンの結果が正確にわかっているので、テストできます)。本番環境でスキャンされたディレクトリは頻繁に変更される場合があります。

したがって、私の唯一の解決策は、テスト フォルダーにテスト固有の偽のディレクトリを作成し、そのパスをスキャナーに渡し、その偽のディレクトリにあるとわかっているものと照合することです。これはベストプラクティスですか、それとも何か不足していますか?

ありがとうございました!

ここにいくつかのコードがあります: テスト

0 投票する
1 に答える
1507 参照

php - phpspec テスト ファイルの内容 / ファイル操作

ファイル操作を処理するクラスを指定する最良の方法に興味があります。

duplicateファイルの内容を複製することを仕事とするメソッドを持つ架空のクラスがあると仮定します。

vfsStream のようなものを使用して、実際のファイルシステムに触れずに変更をアサートできることを知っています (少なくとも PHPUnit でのアサーションを使用)。

仕様でそれをどのように主張できますか? それとも、別の方法でアプローチされますか?

また、その機能を別のクラスに抽出し、Spy を使用して FileOperator がその依存関係を正しく呼び出していることをアサートすることもできますが、それでもそのアダプター クラスを指定する必要があり、疑問が残ります。

ありがとう。

0 投票する
0 に答える
55 参照

php - Cakephp (2.4) で vfsStream を使用することは可能ですか?

vfsStream を使用して cakephp-app のファイルシステム操作をテストしたかったのですが、cakephp の File および Folder クラスを使用して仮想ファイルシステムにファイルを書き込むことは一見不可能であることがわかりました。この理由は、Folder クラスのコンストラクターでの php 関数 realpath() の呼び出しにあるようです。vfsStream は、realpath() を使用すると壊れるようです ( http://stubbles.org/categories/5-vfsStreamを参照してください- "realpath() はまだ機能しません - realpath() がどのように機能するかでこれを機能させる方法はありません)現在、PHP 自体に実装されています。")

私は運が悪いようですが、この問題の回避策を知っている人はいますか?

0 投票する
1 に答える
206 参照

php - pear を使用した vfsstream のインストール

vfsStream環境でPHPUnitで使用するようにセットアップする必要があります。残念ながら、プロジェクトは非常に古く、composer を使用できません。代わりに、ドキュメントに従って pear を使用してインストールしようとしました。Bovigoチャネルは適切に検出されますが、インストールしようとするvfsと、次のスタック トレースが表示されます。