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
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
{
//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.
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 paraShowDialogAsync
. Luego, hacer que la claseMockDialogService
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 enMockDialogService
en lugar del método de extensión.Por ejemplo:
Luego, en el código de prueba, crear una instancia de
MockDialogService
como unIDialogServiceEx
:Esto debería garantizar que se llame al método de instancia en
MockDialogService
en lugar del método de extensión.