Prism测试ShowDialogAsync:自定义IDialogService类方法未被调用问题
问题根本原因
你遇到的问题本质是C#的成员查找优先级基于变量的声明类型,而非运行时实际类型:
- 你的ViewModel中注入的
dialogService的声明类型是IDialogService接口,而原生IDialogService接口本身并没有定义ShowDialogAsync实例方法,这个方法只是Prism提供的扩展方法 - 编译期编译器查找
IDialogService的成员时找不到匹配的ShowDialogAsync实例方法,就会自动绑定到Prism官方的扩展方法,哪怕你在子类MockDialogService中定义了同名方法,运行时也不会走到你的实现,因为编译期的绑定结果已经确定了。
解决方案
最推荐的无侵入方案:直接MockIDialogService原生定义的ShowDialog方法即可,不需要自己写ShowDialogAsync实现。
Prism官方的ShowDialogAsync扩展方法本质就是对原生ShowDialog方法的包装,内部通过TaskCompletionSource把回调转成Task返回,你只要把Mock类的ShowDialog逻辑写对,扩展方法自然会走你的Mock逻辑:
public class MockDialogService : IDialogService { public void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback) { Debug.WriteLine("触发Mock弹窗逻辑"); IDialogResult res = new DialogResult(); // 直接调用回调返回结果,官方扩展方法会把这个结果作为Task的返回值 callback(res); } // 你之前写的ShowDialogAsync方法可以完全删掉,不需要保留 }
如果你非要强制走自己定义的ShowDialogAsync方法,只能修改ViewModel中dialogService的声明类型为MockDialogService,但这种方式对业务代码侵入性较高,不推荐。
内容的提问来源于stack exchange,提问作者Miamy
相关产品推荐
相关产品推荐

