Frage

Ich habe eine Dienst-Proxy-Klasse, die asyn Aufruf in dem Servicebetrieb macht. Ich benutze eine Callback-Methode Ergebnisse passiert zurück zu meiner Ansicht Modell.

Ihre Funktionsprüfung von View-Modell, kann ich Service-Proxy verspotten Methoden auf dem Proxy aufgerufen werden, um sicherzustellen, aber wie kann ich die Callback-Methode wird auch genannt gewährleisten?

Mit RhinoMocks Ich kann, dass Ereignisse testen behandelt und Ereignis auslösen Ereignisse auf dem verspotteten Objekt, aber wie kann ich Rückrufe testen?

Ansichtsmodell:

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);
    }
}

Danke

War es hilfreich?

Lösung

mit diesem ein wenig rumgespielt und ich denke, ich kann, was Sie suchen. Zuerst werde ich den MSTest Code angezeigt Ich tat dies, um zu überprüfen:

[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
{
}

Sie werden ein paar Dinge beachten Sie:

  1. Ich habe Ihren Rückruf intern. Sie müssen die InternalsVisisbleTo () Attribut verwenden, um Ihr Ansichtsmodell Montag Interna Komponententests aussetzt (ich darüber bin nicht verrückt, aber es passiert in seltenen Fällen wie diese).

  2. Ich verwende Rhino.Mocks „Do“ den Rückruf auszuführen, wenn das GetData genannt wird. Es ist nicht mit der Callback geliefert, aber das ist wirklich eher einen Integrationstest. Ich nehme an, Sie ein Ansichtsmodell Unit-Test haben, um sicherzustellen, dass der tatsächliche Rückruf übergeben zu GetData zu gegebener Zeit ausgeführt wird.

  3. Offensichtlich Sie wollen Mock / Stub-Entity und ServiceError erstellen Objekte statt nur new'ing up wie ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top