【问题标题】:Testing Prism DialogService测试 Prism DialogService
【发布时间】:2020-11-10 13:43:38
【问题描述】:

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

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

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

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

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

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

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

dialogService = A.Fake<IDialogService>();

然后将其注入到 ViewModel 中:

var viewModel = new MyViewModel(dialogService);

谢谢

【问题讨论】:

  • 这将有助于在您的测试中查看 dialogService 的实现/创建。如果它是一个模拟,你可以告诉它把你想要的任何参数传递给回调......
  • @Haukinger,你是对的,我已经更新了包括如何实现 dialogService 在内的问题。谢谢

标签: unit-testing prism


【解决方案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 ) );

关键点是回调的设置。没有它,mock 不知道如何处理Action&lt;IDialogResult&gt; 参数,即使它想调用它,它也不知道要使用的参数。

编辑:Fake It Easy 相当于 MOQ 的 Callback 似乎是 Invokes(发现 here)。

【讨论】:

  • Yesssssss,它是:) 也许它对某人有用,所以 Fake It Easy 语法是:A.CallTo(() => dialogService.ShowDialog(A.Ignored, A.Ignored, A>.Ignored)).Invokes>((n, p, c) => c(new DialogResult(ButtonResult.OK)));
猜你喜欢
  • 2021-11-04
  • 2020-03-27
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多