测试棱镜DialogService

时间:2020-11-10 13:43:38

标签: unit-testing 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”总是错误的,因此它总是返回并且从不执​​行“ return”之后的代码

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

也许我的确认对话框方法不好,或者我错过了一些东西,所以任何建议对我都将有很大帮助。

注意:我使用Fake It Easy进行测试,但这不是任何其他测试框架中说明的解决方案。

更新:这是测试中dialogService的实现:

dialogService = A.Fake<IDialogService>();

然后将其注入到ViewModel中:

var viewModel = new MyViewModel(dialogService);

谢谢

1 个答案:

答案 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)。

相关问题