我有一个用于确认的 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
它的工作原理就像一个魅力,但我无法测试返回后的代码,因为在执行测试时“confirmed”总是 false,所以它总是返回并且“return”之后的代码永远不会执行.
我认为测试它的最佳方法应该是以某种方式在“r”中注入(inject) IDialogResult 值,这样我就可以强制我总是在测试 r.Result == ButtonResult.OK
。但是...我该怎么做呢?
也许我的确认对话框方法不好,或者我可能遗漏了一些东西,所以任何建议对我来说都会有很大的帮助。
注意:我使用 Fake It Easy 进行测试,但这不是任何其他测试框架中解释的解决方案的问题。
更新:这是测试中dialogService的实现:
dialogService = A.Fake<IDialogService>();
然后将其注入(inject)到ViewModel中:
var viewModel = new MyViewModel(dialogService);
谢谢
最佳答案
我不知道 Fake It Easy,但是有了 MOQ 和 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 ) );
关键点是回调的设置。没有它,模拟不知道如何处理 Action<IDialogResult>
参数,即使它想调用它,它也不知道要使用的参数。
编辑:Fake It Easy 相当于 MOQ 的 Callback
似乎是Invokes
(找到here)。
关于unit-testing - 测试 Prism DialogService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64770095/