1

組み込みの 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 クラスを非静的にする必要がありますか? 私が見逃している簡単なテクニックはありますか?

4

3 に答える 3

0

個人的には、組み込みのアサーション ライブラリを使用する最初のオプションを好みます。これを拡張メソッドまたは「ヘルパー」でラップしようとすることで得られるメリットがわかりません。

本当にこのルートをたどりたい場合は、一連の拡張メソッドを作成して、IOrganizationServiceそれを渡し続ける必要をなくすことができます。少しきれいになりますが、私はまだ最初のものを支持しています。

crmService.AssertExists(contact);

余談ですが、なぜ「単体」テストで実際の CRM インスタンスをヒットしているのですか? IOrganizationServiceテスト内のモックに対して検証するためのはるかに迅速で保守しやすい。

于 2013-03-29T19:19:54.203 に答える
0

AssertCrm をシングルトンとして作成し、一度インスタンス化すると、他のすべての呼び出しで同じインスタンスが使用されます。

于 2013-03-29T19:12:43.537 に答える
0

いくつかの追加調査の後、静的クラスにする必要がある(しなければならない)理由が見つからず、それ以来、非静的クラスとして作成しました。

同様のことを考えている他の人への注意: すべてのインスタンス メソッドに対して静的メソッドのオーバーロードを作成してくださいClassName.AssertMethod()new ClassName().AssertMethod()

于 2013-04-01T16:36:27.543 に答える