問題タブ [mockery]
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.
php - Mockery は最初にスローし、2 番目の呼び出しで値を返します
残念ながら、それは true を返すだけで、最初に例外をスローしません。メソッドの最初の呼び出しで例外をスローし、2 回目の呼び出しで値を返すにはどうすればよいですか?
編集:
これは、手動で編集Mockery\Expectation.php
して設定すると機能します$_throw
= true
。
php - Mockeryを使用してクラスを部分的にモックする方法は?
私はこのクラスを持っています:
そして、このテスト:
var_dump($m) を実行すると、モックされたメソッドが表示されます。
しかし、テストが実行されると、モックされたものではなく、実際のものが呼び出されます。改名しないと
そして、私は緑を手に入れます。
Mockery を使用してこれらの部分的なモックを行う正しい方法を教えてくれる人はいますか?
phpunit - Illuminate\Database\Eloquent\Model をあざける
Laravel の Eloquent\Model を Mockery でモックする必要がありますが、静的メソッドを使用しているため、ややこしいです。
次のコードでこの問題を解決しましたが、これを行うためのより良い/よりスマートな方法があるかどうか疑問に思います。
unit-testing - インスタンスのモックと暗黙のコンストラクター
データベース接続を管理するクラスで TDD を使用しようとしています。でも
- データベースが利用可能なネットワークから離れて開発していることがよくあります
- SQLite に対しても、実際の接続を台無しにしないでクラスをテストしたいだけです
:memory:
- プラットフォームに依存しない方法で接続をテストしたい場合があります (たとえば、PDO オブジェクトを MySQLi オブジェクトに交換するなど)。特に、データベースはすべてが MySQL ではないため、一部は SQLServer です。
基本的に私はこれをしたい:
そして私のテストランナーでは:
どうにかして PDO クラスのモックを使いたいと思っています。テスト クラス コンストラクターまたはそのメソッドの 1 つに明示的なパラメーターを追加する唯一のオプションはありますか? Mockery のドキュメントに従って「インスタンス モッキング」を使用してみましたが、自動ロードを使用しているため、「致命的なエラーでクラスを再宣言できません」(当然) という結果になります。
テストで純粋に使用されるコードでコントラクトを汚染したくないのですが、それが私の唯一の選択肢ですか?
ご協力いただきありがとうございます
unit-testing - 単体テストからJSONをルートに渡す方法は?
コントローラーが期待するリポジトリをモックすることで、Laravel 4 コントローラーの単体テストを行っています。問題は「ストア」機能にあります。これは、指定されたコントローラーに POST を実行するときに Laravel によって呼び出される関数です。関数が呼び出されitemData
ますが、入力として期待されていますが、それを提供する方法がわかりません。これが私が試したことです:
ItemEntryController
テストクラス
laravel - このテストを書くためのより良い方法はありますか?
私は Laravel と Mockery を使用した単体テストにかなり慣れていないため、次のテストを作成しました。通用しそうです。しかし、おそらくもっと良い方法で書くことができると思います。実装よりもテストの方が壊れやすいようです。これを行うためのより良い方法はありますか?
ItemModelTest.php
アイテム.php
カテゴリ.php*
php - 特定の順序で PHPUnit テストを実際に実行する方法
この質問:特定の順序で PHPUnit テストを実行する には、私が同意する受け入れられた回答がありますが、設計上の問題は PHP と PHPUnit にあります。
私がテストしているプロジェクトでは、ZF2 と Doctrine を使用しています。AbstractHttpControllerTestCase には、ZF2 アプリケーションをインスタンス化し、Response オブジェクトを作成するすべての手順を実行する "dispatch" メソッドがあります。これらのテストには @covers のアノテーションが付けられ、テスト中に実行中のリクエストによって他のメソッドがカバーされないようにします。リクエストには、あらゆる種類のサービスを使用するビュー ヘルパーを呼び出すビュー スクリプトが含まれる場合があるため、特定のリクエストで使用されるすべてのサービスをモックすることは不可能になります (そして、このコードをコピーしてテストごとに維持するのは面倒になります)。
PHPUnit には、別のプロセスでテストを実行する機能があります。これは、新しい PHP インスタンスをフォークし、コンパイル済みのコード テンプレート (奇妙なもの) を供給することによって実行されます。次に、get_included_files() によってリストされたすべてのファイルが含まれます。これには、オートローダーにヒットしたすべてのものが含まれます。preserveGlobalState が無効になっていても、以前のすべてのテストで変更されたすべてのものが新しいプロセスに含まれます。
一部の依存関係 (composer を介してインストール) は、静的メソッド、final とマークされたクラス、またはその両方を使用します。静的メソッドは PHPUnit でモックできます。最終クラスは Mockery を使用してオーバーロードする必要があります。これは、PHPUnit が最終クラスのモック オブジェクトの作成を完全に拒否するためです。クラスと関数のオーバーロード (ネームスペース トリックを使用) は、後続のテストに影響を与えないように、別のプロセスで実行する必要があります。ここまでは順調ですね。
依存関係をオーバーロードするテストを入力して、静的メソッド (final とマークされているかどうかにかかわらず) に期待を設定するか、まだインスタンス化されていないオブジェクトに期待を設定します。これは、以前のテストのいずれも、オーバーロードして期待値を設定するクラスに触れていない場合にのみ機能します。そうしないと、「クラスを再宣言できません」というエラーで失敗します。PHPUnit は、サブプロセスでテスト環境を再作成するためにすべてを含めて役立つように努めましたが、その結果、テスト ケースが台無しになりました。
したがって、たとえば「@group isolated」でテストをマークし、PHPUnit を 2 回呼び出すことなく、他のテストの前にそれらのテストを実行することは非常に便利です (不便なだけでなく、カバレッジ分析が台無しになります)。
あるいは、PHP 5.5 に既に存在するクラスをオーバーライドする方法があれば、問題のあるテスト ケースの前提条件を修正することができます。しかし、それはおそらく起こらないでしょう (いずれにせよ、ランキットは受け入れられる答えではありません)。