我有一个棱镜确认对话框服务(对话框中的“是”和“否”按钮),并且以此方式使用它;
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”总是错误的,因此它总是返回并且从不执行“ return”之后的代码
我认为最好的测试方法应该是以某种方式在“ r”中注入IDialogResult值,因此我可以强制我一直在测试r.Result == ButtonResult.OK
。但是...我该怎么做?
也许我的确认对话框方法不好,或者我错过了一些东西,所以任何建议对我都将有很大帮助。
注意:我使用Fake It Easy进行测试,但这不是任何其他测试框架中说明的解决方案。
更新:这是测试中dialogService的实现:
dialogService = A.Fake<IDialogService>();
然后将其注入到ViewModel中:
var viewModel = new MyViewModel(dialogService);
谢谢
答案 0 :(得分:1)
我不知道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等效于起订量的Callback
似乎是Invokes
(找到here)。