Prism - 如何测试 ShowDialogAsync(调用扩展方法而不是 class 方法)
Prism - how to test ShowDialogAsync (Extension method being called instead of class method)
我们知道,如果 class 中的方法和具有相同签名的扩展方法,则应调用 class 中的方法而不是扩展方法。
所以我的问题是下一个。我正在尝试从 Prism.Services.Dialogs
模拟 IDialogService
。我的目标是为可以测试的 ShowDialogAsync
方法创建一个模拟(无法模拟 static/extensions 方法)。
ShowDialogAsync
方法的签名是:
namespace Prism.Services.Dialogs
...
public static Task<IDialogResult> ShowDialogAsync(this IDialogService dialogService,
string name, IDialogParameters parameters = null);
所以我创建了 class MockDialogService
:
namespace LoadApp.Core.Helpers
{
public class MockDialogService : IDialogService
{
public void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> 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; }
}
}
并在测试中使用它:
_dialogService = new MockDialogService();
...
var viewModel = new ViewModel(_dialogService);
在调试会话期间,我看到模型中的 dialogService
是我的 class MockDialogService
的实例。但是我的 class 中的 ShowDialogAsync
方法没有调用,它仍然是调用的扩展方法。我错过了什么?提前谢谢你。
花了一些时间后我找到了解决方法。
我创建了自己的扩展方法:
public static class MyDialogServiceExtensions
{
public static Task<IDialogResult> ShowDialogAsync(this IDialogService dialogService, string name, IDialogParameters parameters = null)
{
if (dialogService is MockDialogService myService)
{
return myService.ShowDialogAsync(name, parameters);
}
return IDialogServiceExtensions.ShowDialogAsync(dialogService, name, parameters);
}
}
并改变了调用方式
await dialogService.ShowDialogAsync("MyDialogPage", parameters);
到
await MyDialogServiceExtensions.ShowDialogAsync(dialogService, "MyDialogPage", parameters);
P.S。我更改了问题名称,以帮助有相同问题的其他人找到此主题。
我们知道,如果 class 中的方法和具有相同签名的扩展方法,则应调用 class 中的方法而不是扩展方法。
所以我的问题是下一个。我正在尝试从 Prism.Services.Dialogs
模拟 IDialogService
。我的目标是为可以测试的 ShowDialogAsync
方法创建一个模拟(无法模拟 static/extensions 方法)。
ShowDialogAsync
方法的签名是:
namespace Prism.Services.Dialogs
...
public static Task<IDialogResult> ShowDialogAsync(this IDialogService dialogService,
string name, IDialogParameters parameters = null);
所以我创建了 class MockDialogService
:
namespace LoadApp.Core.Helpers
{
public class MockDialogService : IDialogService
{
public void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> 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; }
}
}
并在测试中使用它:
_dialogService = new MockDialogService();
...
var viewModel = new ViewModel(_dialogService);
在调试会话期间,我看到模型中的 dialogService
是我的 class MockDialogService
的实例。但是我的 class 中的 ShowDialogAsync
方法没有调用,它仍然是调用的扩展方法。我错过了什么?提前谢谢你。
花了一些时间后我找到了解决方法。
我创建了自己的扩展方法:
public static class MyDialogServiceExtensions
{
public static Task<IDialogResult> ShowDialogAsync(this IDialogService dialogService, string name, IDialogParameters parameters = null)
{
if (dialogService is MockDialogService myService)
{
return myService.ShowDialogAsync(name, parameters);
}
return IDialogServiceExtensions.ShowDialogAsync(dialogService, name, parameters);
}
}
并改变了调用方式
await dialogService.ShowDialogAsync("MyDialogPage", parameters);
到
await MyDialogServiceExtensions.ShowDialogAsync(dialogService, "MyDialogPage", parameters);
P.S。我更改了问题名称,以帮助有相同问题的其他人找到此主题。