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。我更改了问题名称,以帮助有相同问题的其他人找到此主题。