测试棱镜对话服务

Testing Prism DialogService

我有一个用于确认的 Prism 对话框服务(对话框中的是和否按钮),我就是这样使用的;

bool confirmed = false;

DialogParameters p = new DialogParameters
{
    { "title", title },
    { "message", message }
};
dialogService.ShowDialog("ConfirmationDialog", p, r => { confirmed = r.Result == ButtonResult.OK; });

if (!confirmed)
{
    return;
}

// code I am not able to test

它就像一个魅力,但我无法测试 return 之后的代码,因为在我执行测试时“确认”总是错误的,所以它总是 returns并且“return”之后的代码永远不会执行。

我认为测试它的最佳方法应该是以某种方式在“r”中注入 IDialogResult 值,这样我就可以强制我一直在测试 r.Result == ButtonResult.OK。但是...我该怎么做?

也许我的确认对话框方法不好,或者我遗漏了什么,所以任何建议都会对我有很大帮助。

注意:我使用 Fake It Easy 进行测试,但在任何其他测试框架中解释的解决方案都不是问题。

更新:这是测试中对话框服务的实现:

dialogService = A.Fake<IDialogService>();

然后在ViewModel中注入:

var viewModel = new MyViewModel(dialogService);

谢谢

我不知道 Fake It Easy,但是有了最小起订量和 NUnit,我会这样写:

// Arrange
var dialogServiceMock = new Mock<IDialogService>();
dialogServiceMock.Setup( x => x.ShowDialog( It.IsAny<string>(), It.IsAny<IDialogParameters>(), It.IsAny<Action<IDialogResult>>() ) )
                 .Callback<string, IDialogParameters, Action<IDialogResult>>( ( n, p, c ) => c( new DialogResult( ButtonResult.OK ) ) );

// Act
var receivedResult = ButtonResult.None;
dialogServiceMock.Object.ShowDialog( "my name", new DialogParameters( "my parameters" ), r => receivedResult = r.Result );

// Assert
Assert.That( receivedResult, Is.EqualTo( ButtonResult.OK ) );

重点是回调的设置。没有它,mock 不知道如何处理 Action<IDialogResult> 参数,即使它想调用它,也不知道要使用的参数。

编辑:Fake It Easy 相当于最小起订量的 Callback 似乎是 Invokes(发现 here)。