質問

Asynがサービスオペレーションを呼び出すサービスプロキシクラスがあります。コールバックメソッドを使用して、結果を自分のビューモデルに戻します。

ビューモデルの機能テストを行うと、サービスプロキシをmockしてプロキシでメソッドが呼び出されるようにしますが、コールバックメソッドも呼び出されるようにするにはどうすればよいですか?

Rhinomocksを使用すると、イベントが処理され、イベントがモックされたオブジェクトでイベントを提起することをテストできますが、コールバックをテストするにはどうすればよいですか?

ViewModel:

public class MyViewModel
{
    public void GetDataAsync()
    {
        // Use DI framework to get the object
        IMyServiceClient myServiceClient = IoC.Resolve<IMyServiceClient>();
        myServiceClient.GetData(GetDataAsyncCallback);
    }

    private void GetDataAsyncCallback(Entity entity, ServiceError error)
    {
        // do something here...
    }

}

ServiceProxy:

public class MyService : ClientBase<IMyService>, IMyServiceClient
{
    // Constructor
    public NertiAdminServiceClient(string endpointConfigurationName, string remoteAddress)
        :
            base(endpointConfigurationName, remoteAddress)
    {
    }

    // IMyServiceClient member.
    public void GetData(Action<Entity, ServiceError> callback)
    {
        Channel.BeginGetData(EndGetData, callback);
    }

    private void EndGetData(IAsyncResult result)
    {
        Action<Entity, ServiceError> callback =
            result.AsyncState as Action<Entity, ServiceError>;

        ServiceError error;
        Entity results = Channel.EndGetData(out error, result);

        if (callback != null)
            callback(results, error);
    }
}

ありがとう

役に立ちましたか?

解決

これを少し遊んで、私はあなたが探しているものを持っているかもしれないと思います。まず、これを確認するために行ったMSTESTコードを表示します。

[TestClass]
public class UnitTest3
{
    private delegate void MakeCallbackDelegate(Action<Entity, ServiceError> callback);

    [TestMethod]
    public void CallbackIntoViewModel()
    {
        var service = MockRepository.GenerateStub<IMyServiceClient>();
        var model = new MyViewModel(service);

        service.Stub(s => s.GetData(null)).Do(
            new MakeCallbackDelegate(c => model.GetDataCallback(new Entity(), new ServiceError())));
        model.GetDataAsync(null);
    }
}

public class MyViewModel
{
    private readonly IMyServiceClient client;

    public MyViewModel(IMyServiceClient client)
    {
        this.client = client;
    }

    public virtual void GetDataAsync(Action<Entity, ServiceError> callback)
    {
        this.client.GetData(callback);
    }

    internal void GetDataCallback(Entity entity, ServiceError serviceError)
    {

    }
}

public interface IMyServiceClient
{
    void GetData(Action<Entity, ServiceError> callback);
}

public class Entity
{
}

public class ServiceError
{
}

いくつかのことに気付くでしょう:

  1. 私はあなたのコールバックを内部にしました。 internalsvisisbleto()属性を使用する必要があるため、ViewModelアセンブリは内部をユニットテストに公開します(私はこれに夢中ではありませんが、このようなまれな場合には起こります)。

  2. rhino.mocks "do"を使用して、getdataが呼び出されるたびにコールバックを実行します。提供されたコールバックを使用していませんが、これは本当に統合テストです。 GetDataに渡された実際のコールバックが適切な時期に実行されることを確認するために、ViewModelユニットテストがあると思います。

  3. 明らかに、私がしたように新しい「エンティティとサービスエラーオブジェクトを作成する」ことをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top