es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prism: cómo probar ShowDialogAsync (Método de extensión que se llama en lugar del método de clase)

Como sabemos, si hay un método en una clase y un método de extensión con la misma firma, el método en la clase debe ser llamado en lugar del de extensión.

Entonces, mi problema es el siguiente. Estoy tratando de falsificar IDialogService de Prism.Services.Dialogs. Mi objetivo es tener una falsificación para el método ShowDialogAsync que pueda ser probado (los métodos estáticos/de extensión no pueden ser falsificados).

La firma del método ShowDialogAsync es:

namespace Prism.Services.Dialogs

public static Task ShowDialogAsync(this IDialogService dialogService,
string name, IDialogParameters parameters = null);

Así que creé la clase MockDialogService:

namespace LoadApp.Core.Helpers
{
public class MockDialogService : IDialogService
{
public void ShowDialog(string name, IDialogParameters parameters, Action callback)
{
//throw new NotImplementedException();
}

    public Task<IDialogResult> ShowDialogAsync(string name, IDialogParameters parameters = null)
    {
        Debug.WriteLine("ShowDialogAsync");
        IDialogResult res = new DialogResult();
        return Task.FromResult(res);
    }
}

public class DialogResult : IDialogResult
{
    public Exception Exception { get; set; }
    public IDialogParameters Parameters { get; set; }
}

}

y lo uso en la prueba:

_dialogService = new MockDialogService();

var viewModel = new ViewModel(_dialogService);

Durante la sesión de depuración veo que el dialogService del modelo es la instancia de mi clase MockDialogService. Pero el método ShowDialogAsync de mi clase no se llama, aún se llama el método de extensión. ¿Qué me he perdido? Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema es que el método de extensión está siendo llamado en lugar del método en la clase MockDialogService. Esto se debe a que los métodos de extensión tienen menor precedencia que los métodos de instancia con la misma firma.

    Una solución a este problema es crear una interfaz que extienda la interfaz IDialogService e incluya una nueva firma de método para ShowDialogAsync. Luego, hacer que la clase MockDialogService implemente esta nueva interfaz e incluya una implementación para la nueva firma de método. De esta manera, se llamará al método de instancia en MockDialogService en lugar del método de extensión.

    Por ejemplo:

    public interface IDialogServiceEx : IDialogService
    {
        Task<idialogresult> ShowDialogAsync(string name, IDialogParameters parameters);
    }
    
    public class MockDialogService : IDialogServiceEx
    {
        // implementar los métodos de IDialogService...
    
        public Task<idialogresult> ShowDialogAsync(string name, IDialogParameters parameters = null)
        {
            // implementar el nuevo método...
        }
    }
    

    Luego, en el código de prueba, crear una instancia de MockDialogService como un IDialogServiceEx:

    _dialogService = new MockDialogService();
    ...
    var viewModel = new ViewModel((IDialogServiceEx)_dialogService);
    

    Esto debería garantizar que se llame al método de instancia en MockDialogService en lugar del método de extensión.

Comments are closed.