0

私はユニットテストを学ぼうとしていますが、次のような状況に陥っています。

  1. 私はモデルを持っています: SalesOrder - eコマースストアでの注文をモデル化します
  2. SalesOrder には、gift_message_id というプロパティがあります。
  3. ギフト メッセージ ID は整数値で、GiftMessage モデルへの外部キーです
  4. GiftMessage モデルには、注文モデルを取り、SalesOrder に基づいて GiftMessage インスタンスを正しくロードできるメソッドがあります。

この動作を正確にテストするテストを作成しようとしていますが、最終的に 2 つのモック (SalesOrder 用に 1 つ、GiftMessage 用に 1 つ) になり、意味がありません。ここで何が間違っていますか?

私がテストしようとしている方法は次のようになります。

public function loadGiftMessageByOrderModel(SalesOrder $order)
{
    $giftMessageId = $order->getGiftMessageId();

    //if the order has a gift message id then load the gift message model and return it
    if ($giftMessageId !== false) {
        return new GiftMessage($giftMessageId);
    }
    return false;
}

注文とギフトメッセージのデータがデータベースに保存されていることを念頭に置いて、これを単体テストするにはどうすればよいでしょうか。

4

2 に答える 2

0

コンストラクターを呼び出すメソッドがあり、コンストラクターで重要な作業が行われると、問題が発生します。上記からわかる最良のオプションは、上記のクラスにGiftMessageFactoryインスタンスを保持させることです。次に、ファクトリをモックして、適切な値と適切な時間で呼び出されることを検証できます。

于 2013-03-29T16:27:53.560 に答える
0

関数を作成loadGiftMessageByOrderModelし、GiftMessage コンストラクターを説明したように、このコードを簡単に単体テストできるとは思いません。きれいにテストするには、コンストラクターではないメソッドで DB から GiftMessage をロードする必要があります。コンストラクターは、データベースと対話するメソッドを呼び出すべきではありません。別のクラスまたはメソッドがそのロードを実行してから、コンストラクターを呼び出す必要があります。おおよそ、次のようなものです。

public function loadGiftMessageByOrderModel(SalesOrder $order)
{
    $giftMessageId = $order->getGiftMessageId();

    //if the order has a gift message id then load the gift message model and return it
    if ($giftMessageId !== false) {
        // $giftMessageLoader handles loading from the DB; it doesn't create a GiftMessage object
        $giftMessageRecord = $giftMessageLoader.loadById( $giftMessageId );
        // $giftMessageFactory actually calls the constructor to create a GiftMessage
        return $giftMessageFactory.createFromRecord( $giftMessageRecord );
    }
    return false;
}

次に、$giftMessageLoader.loadById呼び出しをモックして、データベースから返されるものを制御できます。$giftMessageFactoryまた、コンストラクターが適切に呼び出さGiftMessageれ、適切なオブジェクトが作成されることをテストすることもできます。

ここでの全体的な教訓は、コンストラクターは単純であるべきだということです。オブジェクトが正しく構築されるようにパラメーターを検証できますが、おそらくアプリケーションの他の重要な部分を呼び出すべきではありません。

于 2013-03-31T18:46:13.087 に答える