組み込みの Visual Studio 単体テスト ツールを使用して、CRM 2011 に対して単体テストを実行します。多くのテストは、エンティティの作成をアサートします。
Assert.IsNull(service.GetFirstOrDefault<Contact>(contact.Id));
(GetFirstOrDefault は、CRM から ID で連絡先を取得しようとする拡張メソッドであり、見つからない場合は null を返します)
次のように動作する独自の Assert メソッドを作成したいと思います。
CrmAssert.Exists(service, contact);
最初は から継承するのがいいと思ったのAssert
ですが、残念ながらこれは static クラスです。次に、次のような新しい静的クラスを作成しました。
public static class AssertCrm
{
public static void Exists<T>(IOrganizationService service, T entity) where T : Entity
{
Exists(service, entity, null, null);
}
public static void Exists<T>(IOrganizationService service, T entity, string message) where T : Entity
{
Exists(service, entity, message, null);
}
public static void Exists<T>(IOrganizationService service, T entity, string message, params object[] parameters) where T: Entity
{
if (service.GetFirstOrDefault<T>(entity.Id) == null)
{
throw new AssertFailedException(message == null ? String.Format(message, parameters));
}
}
}
次のように呼び出されます。
AssertCrm.Exists(service, contact);
これは問題ありませんが、サービスを 1 回設定すれば、毎回呼び出す必要はありません。
AssertCrm.Service = service;
AssertCrm.Exists(contact);
AssertCrm.Exists(campaign);
AssertCrm.Exists(etc...);
しかし、Visual Studio はテストをマルチスレッドで実行しようとするでしょう。つまり、Service
静的プロパティを設定すると、別のテストで別のサービスによってオーバーライドされる可能性があります (IOrganizationService
スレッドセーフではないだけでなく)。
マルチスレッドについて心配する必要がないように、AssertCrm クラスを非静的にする必要がありますか? 私が見逃している簡単なテクニックはありますか?