【发布时间】: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 子句中有这个命名空间。
标签: c# testing prism extension-methods