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(调用扩展方法而不是类方法)的主要内容,如果未能解决你的问题,请参考以下文章

使用Prism 7.1,x在UnityContainer中注册模拟对象以进行单元测试

Prism统一管理运维工具测试

Delphi Prism 中的操作系统指令

Prism 源码解读3-Modules加载

prism图怎么显示数据

Prism:如何在区域中注入视图模型实例?