テスト可能なコードのテストと作成を初めて行ったので、この単純なシナリオを処理する正しい方法を明確にしています。私は他の質問や答えを同じようなタイトルで読んだことがありますが、私が求めていることに対して明確な答えを提示していないようです。Laravelの別のモデルでメソッドを呼び出すユニットテストモデルメソッドの使用方法
私は私のPicking
クラスのインスタンスでshipped()
メソッドを呼び出して、コントローラを持っている:
class MyController extends \BaseController {
public function controllerMethod() {
$picking = new Picking;
$picking->shipped($shipmentData);
}
}
Picking
モデルは次のようになります。
class Picking extends \Eloquent {
public function order() {
return $this->belongsTo('Order');
}
public function shipped($shipmentData) {
$this->carrier = $shipmentData['Carrier'];
$this->service = $shipmentData['Service'];
$this->is_shipped = true;
$this->save();
$this->order->pickingShipped();
}
}
あなたが見ることができるように、このshipped()
方法いくつかのデータを保存した後、Order
のpickingShipped()
メソッドを呼び出します。
今、私はshipped()
メソッドのテストを書こうとしていますが、これを行う適切な方法がわかりません。私は嘲笑について読んだことがあるが、これが嘲笑が必要な状況であれば混乱している。私はいくつかの解決策を考えてきましたが、いずれかが正しいかどうかはわかりません。
1)コントローラーがpickingShipped()
メソッドを呼び出すようにコードを並べ替え、shipped()
メソッドから削除できるようにしてテストを簡素化します。
例えば、shipped()
方法の最後の行が除去されると、制御コードが変更になる:試験において
$picking = new Picking;
$picking->shipped($shipmentData);
$picking->order->pickingShipped();
2)は、そのようorder
にモックメソッドを使用テストでは、pickingShipped()
メソッドが呼び出されたことを単純に確認できます。
何が説明されているのかに沿って何かhereこれは、テストはこのような何かを行うことができますを意味します:
$order->expects($this->once())->method('pickingShipped')
しかし、私はそれは私も順序依存性ではなく、このようなshipped()
メソッド内order
関係、に頼るを注入する必要があることを意味すると思う:
class Picking extends \Eloquent {
public function order() {
return $this->belongsTo('Order');
}
public function shipped(Order $order, $shipmentData) {
$this->carrier = $shipmentData['Carrier'];
$this->service = $shipmentData['Service'];
$this->is_shipped = true;
$this->save();
$order->pickingShipped();
}
}
そして、コントローラのコードは次のようになりなければならないでしょう:
$picking = new Picking;
$picking->shipped($picking->order, $shipmentData);
これは少しstranを感じています私は本当に何が正しいのかよく分かりません。
私の質問は、このコードを書いてテストする正しい方法は何ですか? shipped()
メソッドが適切なデータを自身で設定するのは簡単ですが、最後にpickingShipped()
を呼び出すのはどうでしょうか?これは、テストをより複雑にするようです。だからコードを再配置する必要がありますか?もしそうなら、どうですか?または、これは私が2番目のオプションで概説したような嘲笑のための共通のユースケースですか?もしそうなら、私が示しているように依存関係を注入するのは正しいですか?
フィードバックありがとうございます!このアプローチの私の唯一の問題は、実際には許されるべきでないときにメソッドに '$ order 'を渡すことができるということです。このメソッドのポイントは、ピッキングの順番ではなく、ピッキングの順番で 'pickingShipped'を呼び出さなければならないということです。つまり、テスト目的でのみこのパラメータを追加しています。テスト目的のためだけにメソッドシグネチャを変更するのは奇妙なことです。今や、この方法は、実際には使用すべきではない動作に使用されるべきであることを示唆しています。 – flyingL123
デフォルトの引数に関しては、yesのPHPはそれらを渡すことができますが、 '$ this-> order'のような動的な値を持つことはできません。この場合、デフォルト値を 'null'に設定し、メソッドの最初に' if(is_null($ order))$ order = $ this-> order; 'を実行すると、しかし、私が上で述べたように、この依存性注入のアプローチは、私にとって正しいと感じていません。 – flyingL123