Prism - 如何测试 ShowDialogAsync(调用扩展方法而不是类方法)
Posted
技术标签:
【中文标题】Prism - 如何测试 ShowDialogAsync(调用扩展方法而不是类方法)【英文标题】:Prism - how to test ShowDialogAsync (Extension method being called instead of class method) 【发布时间】:2022-01-03 14:24:09 【问题描述】:众所周知,如果类中的方法和扩展方法具有相同的签名,则应该调用类中的方法而不是扩展方法。
所以我的问题是下一个。我正在尝试从Prism.Services.Dialogs
模拟IDialogService
。我的目标是模拟可以测试的ShowDialogAsync
方法(不能模拟静态/扩展方法)。
ShowDialogAsync
方法的签名是:
namespace Prism.Services.Dialogs
...
public static Task<IDialogResult> ShowDialogAsync(this IDialogService dialogService,
string name, IDialogParameters parameters = null);
所以我创建了类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
是我的类MockDialogService
的实例。但是我的类中的ShowDialogAsync
方法没有调用,它仍然是扩展方法。我错过了什么?提前谢谢你。
【问题讨论】:
" 如果类中的方法和扩展方法具有相同的签名,则应调用类中的方法而不是扩展方法" - 是的,如果两者都在 范围内 i> 在编译调用站点时,C# 编译器必须选择正在调用的特定方法并将标识该方法的标记插入到 IL 中。那么,您的新ShowDialogAsync
方法是否在编译该方法的 调用 时的范围内?
@Damien_The_Unbeliever,我想,是的,因为我的 using 子句中有这个命名空间。
【参考方案1】:
花了一些时间后,我找到了解决方法。
我创建了自己的扩展方法:
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);
附:我更改了问题名称,以帮助有相同问题的其他人找到该主题。
【讨论】:
以上是关于Prism - 如何测试 ShowDialogAsync(调用扩展方法而不是类方法)的主要内容,如果未能解决你的问题,请参考以下文章