【问题标题】:Prism - how to test ShowDialogAsync (Extension method being called instead of class method)Prism - 如何测试 ShowDialogAsync(调用扩展方法而不是类方法)
【发布时间】: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


【解决方案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);

附:我更改了问题名称,以帮助有相同问题的其他人找到该主题。

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2021-02-07
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多