3

ユーザーがイベント ページで電子メール アドレスを入力したときに、イベント リマインダーを追加する必要があります。イベントは別のドメイン オブジェクトです。最初に考えたのは、Customer ドメイン オブジェクトと関連する CustomerService を作成することでした。

public class CustomerService {
    public void AddEventReminder(string emailAddress, int eventId) {
       var customer = new Customer(emailAddress);
       customer.AddEmailReminder(eventId);
    }
}

新規顧客に対して AddEmailReminder メソッドが実際に呼び出されたことを単体テストで確認するにはどうすればよいでしょうか。

私の考え:

  1. ファクトリを使用して顧客を作成します。オブジェクトの作成が複雑な場合にのみファクトリを使用することになっていると思っていたので、これはにおいがします。
  2. 悪いコード。多分これを行うためのより良い方法がありますか?
  3. モクマジック。

別のメモとして (関連している可能性があります)、ここで集約ルートをどのように決定するのでしょうか? 私たちは顧客を勝手に決めましたが、それはイベントでもあります。集約ルートに関する記事を読んで理解しましたが、このシナリオでは不明です。

4

2 に答える 2

6

このような場合、顧客を作成するサービスで保護されたメソッドを作成し、テストでそのメソッドを匿名の内部クラスでオーバーライドして、模擬のCustomerオブジェクトを返すようにします。次に、モックのCustomerオブジェクトで、AddEmailReminderが呼び出されたことを確認できます。何かのようなもの:

public class CustomerService {
    public void AddEventReminder(string emailAddress, int eventId) {
       var customer = createCustomer(emailAddress);
       customer.AddEmailReminder(eventId);
    }

    protected Customer createCustomer(string emailAddress) {
       return new Customer(emailAddress);
    }
}

テストでは(C#の知識が限られていると仮定しますが、要点を説明する必要があります):

void testCustomerCreation() {
    /* final? */ Customer mockCustomer = new Customer("email");
    CustomerService customerService = new CustomerService() {
       protected Customer createCustomer(string emailAddress) {
           return mockCustomer;
       }            
    };

    customerService.AddEventReminder("email", 14);

    assertEquals(mockCustomer.EventReminder() /* ? */, 14);
}
于 2010-01-06T18:53:14.707 に答える
2

CustomerService API についての考え

この操作を CustomerService にカプセル化することにした特定の理由はありますか? これは私には少し貧血に見えます。代わりに、顧客に直接カプセル化することはできますか?

おそらく、物事を単純化するために、CustomerService コード例の一部を省略しました...

ただし、必要に応じて署名を変更して Customer インスタンスを取得すると、問題が解決します。

public void AddEventReminder(Customer customer, int eventId)

しかし、繰り返しますが、Int32 はほとんどドメイン オブジェクトとして修飾されないため、署名は実際には

public void AddEventReminder(Customer customer, Event event)

問題は、このメソッドが何らかの価値を追加するかどうかです。

集約ルートはどれですか?

それらのどれもないと思います。集約ルートは、ルートを介してのみ子を管理することを示しており、この場合、どちらの方法でも意味がありません。

次のオプションを検討してください。

Event をルートにすると、CustomerRepository を持たない可能性があり、Customer を取得、編集、永続化できる唯一の方法は、Event を使用することになります。それは私には非常に間違っているように聞こえます。

Customer をルートにすると、EventRepository を持つことができなくなり、Event を取得、編集、永続化できる唯一の方法は、特定の Customer を使用することになります。それは私には間違っているように聞こえます。

唯一残っている可能性は、それらが別々のルートであるということです。これはまた、それらが互いに緩やかにしか接続されておらず、顧客のイベントまたはイベントの顧客を検索するためにある種のドメイン サービスが必要になることも意味します。

于 2010-01-07T08:23:05.840 に答える