2

イベントをトリガーしたものに関するデータを含むイベントハンドラーをトリガーするWebサービスからイベント通知を受信して​​います。イベントハンドラーが呼び出されa、すべて適切な値で呼び出されることをテストしようとしています。これは、Webサービスに依存しないと不可能です。bc

EventArgs私の解決策は、サービスライブラリ(Exchange Webサービス)を介して返されるコンバーターを、サードパーティのサービスに依存せずにダムオブジェクトが理解できるものに変換するコンバーターを作成することです。私の問題はEventArgs、EWSライブラリによって与えられたクラスに内部コンストラクターがあるため、リフレクションをあまり使用せずに、ランダムなプロパティ値を使用してそのインスタンスを生成する簡単な方法がないことです。

たとえば、私は単純なインターフェイスを持っています:

public interface IConverter<TFrom, TTo>
{
    TTo Convert(TFrom from);
}

と簡単な実装:

public class NotificationEventArgsConverter : IConverter<NotificationEventArgs, NewNotification>
{
    public NewNotification Convert(NotificationEventArgs from)
    {
        return new NewNotification
                   {
                       ItemIds = from.Events.Cast<ItemEvent>().Select(x => x.ItemId.ToString())
                   };
    }
}

NotificationEventArgs問題は、ランダムな値を持つのインスタンスをどのように生成できるかです。検索で見逃したこのライブラリはありますか?

これの全体的な目標はNotificationEventArgs、次の値を持つのインスタンスを受け取った場合にエミュレートすることであり、次のNewNotificationようになりますx

編集

それまでの間、私は単にを使用しますtypeof(T).GetConstructor()

4

2 に答える 2

2

AutoFixtureをご覧になることをお勧めします。

AutoFixture は、開発者が関連性のないテスト フィクスチャのセットアップを自動化することでテスト駆動開発を容易にし、テスト開発者が各テスト ケースの本質に集中できるようにします。

Microsoft.Exchange.WebServices の逆コンパイルを実行し、リフレクションで少し遊んだ後、たとえば次のように実行できます。

var fixture = new Fixture();

// retrieve internal FolderEvent(EventType, DateTime) ctor
// using FolderEvent class as NotificationEvent is abstract
var notificationEventCtor = typeof(FolderEvent).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance,
    null,
    new Type[] { typeof(EventType), typeof(DateTime) },
    null
);

// generate 10 random events with some help of LINQ and AutoFixture
var trashData = Enumerable
    .Range(1, 10)
    .Select(i => new object[]
        {
            fixture.CreateAnonymous<EventType>(),
            fixture.CreateAnonymous<DateTime>() 
        })
    .Select(p => notificationEventCtor.Invoke(p))
    .Cast<NotificationEvent>()
    .ToList();

上記のコードはリストに 10 を生成し、コンストラクターFolderEventsに渡す準備ができていますNotificationEventArgs(これも内部であるため、同じコードが適用されます)。

var notificationEventArgsCtor = typeof(NotificationEventArgs).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance,
    null,
    new Type[] 
    { 
        typeof(StreamingSubscription),
        typeof(IEnumerable<NotificationEvent>) 
    },
    null
);

var instance = notificationEventArgsCtor
    .Invoke(new object[] { null, trashData });
于 2012-04-10T14:10:49.873 に答える
1

PrivateObjectクラス (特にこれらのコンストラクターの オーバーロード)を見てください。すべてのリフレクション作業をラップし、非パブリック コンストラクターを使用してオブジェクトを作成したり、それらのオブジェクトの非パブリック メソッドやプロパティにアクセスしたりできます。Targetプロパティを使用して、基になるオブジェクトを取得できます。

于 2012-04-10T19:22:30.023 に答える