gpt4 book ai didi

c# - 如何对测试( View 模型)类中的方法调用进行单元测试?

转载 作者:行者123 更新时间:2023-12-03 10:31:50 24 4
gpt4 key购买 nike

我用 xUnit 起订量 .

在我的主视图型号 类我有一个由两个命令调用的方法。该方法更新了几个属性:
`

public void CommandCompletedControlsSetup()
{
//TokenSource.Dispose();
UpdateStatusBar = 0;
VisibilityStatusBar = Visibility.Hidden;
ValidateButtons();
ProgressDisplay = "";
WorkStatus = "";
VisibilityCancellingMsg = Visibility.Visible;
VisibilityCancelTestingBtn = Visibility.Collapsed;
VisibilityTestingBtn = Visibility.Visible;
VisibilityCancelUpdatingBtn = Visibility.Collapsed;
VisibilityUpdatingBtn = Visibility.Visible;
}

我只是想避免为每个命令测试整个方法的更新。第一个命令执行:
public void OnUpdateCancellationExecute(object obj)
{
_updateDataService.CancelUpdates();

CommandCompletedControlsSetup(); // here is method call
}

第二条命令执行:
public void OnSimulateCancellationExecute(object obj)
{
_simulateDataService.CancelSimulation();

CommandCompletedControlsSetup(); // here is method call
}

所以不要这样做两次:
[Fact]
public void OnSimulateCancellationExecute_UpdatesViewProps_True()
{
_viewModel.UpdateStatusBar = 1000;
_viewModel.VisibilityStatusBar = Visibility.Visible;
_viewModel.ProgressDisplay = "1000/1000";
_viewModel.WorkStatus = "some status";
_viewModel.VisibilityCancellingMsg = Visibility.Hidden;
_viewModel.VisibilityCancelTestingBtn = Visibility.Visible;
_viewModel.VisibilityTestingBtn = Visibility.Hidden;
_viewModel.VisibilityCancelUpdatingBtn = Visibility.Visible;
_viewModel.VisibilityUpdatingBtn = Visibility.Hidden;

_viewModel.SimulateCancellationCommand.Execute(null);

Assert.Equal(0, _viewModel.UpdateStatusBar);
Assert.Equal(Visibility.Hidden, _viewModel.VisibilityStatusBar);
Assert.Equal("", _viewModel.ProgressDisplay);
Assert.Equal("", _viewModel.WorkStatus);
Assert.Equal(Visibility.Visible, _viewModel.VisibilityCancellingMsg);
Assert.Equal(Visibility.Collapsed, _viewModel.VisibilityCancelTestingBtn);
Assert.Equal(Visibility.Visible, _viewModel.VisibilityTestingBtn);
Assert.Equal(Visibility.Collapsed, _viewModel.VisibilityCancelUpdatingBtn);
Assert.Equal(Visibility.Visible, _viewModel.VisibilityUpdatingBtn);
}

我想做这样的事情:
[Fact]
public void CancellationExecuteMethods_UpdatesViewProps_True()
{
_viewModel.SimulateCancellationCommand.Execute(null);

_viewModel.UpdateCancellationCommand.Execute(null);

//MainViewModel does not contain definition for Verify - exception
_viewModel.Verify(sd => sd.CancelUpdates(), Times.Exactly(2));
}

但是 主视图型号 没有被 mock ,我不确定我是否能够 mock 它?如果是,那么如何?如果没有,是否有任何替代方法来测试调用了 VM 方法?还是我应该将其保留为显而易见的,然后自行测试该方法?

最佳答案

模拟和依赖倒置原则齐头并进。如果你想模拟一些东西,你需要“反转”模拟目标的依赖关系,这样你就可以用一个实际的模拟对象实例来替换一个具体的实现。在您的具体示例中,您需要提取 CommandCompletedControlsSetup()进入一个单独的类并使用构造函数注入(inject)将其传递给 View 模型。由于 View 模型需要一个无参数构造函数才能在 XAML 中对其进行实例化,这将导致应用程序启动发生重大变化。我不知道你现在是怎么做的,但你需要引导你的应用程序并让你的 DI 容器创建 View 实例并手动显示。

您可以选择的另一个选择是不理会这些命令,不要明确地测试它们。您的命令由一组方法组成。一种准确的方法(另一种方法是CommandCompletedControlsSetup(),您不想测试)。
在您的两个示例中,您的命令都会调用服务类的公共(public)方法:updateDataService.CancelUpdates();_simulateDataService.CancelSimulation(); .
因此,您可能已经测试过此服务。如果不是,您可以或应该测试它们。如果你测试了这个服务,你也隐式地测试了你的 View 模型命令,因为它们依赖于这些服务。这样你就走了CommandCompletedControlsSetup() .

但总的来说,您想要模拟的每个行为以及您想要测试的类型的一部分,都必须注入(inject)该类型。

作为旁注,我个人更喜欢将我的控件的可见性绑定(bind)到我的 View 模型使用转换器公开的 bool 属性。您可以使用 BooleanToVisibilityConverter .NET 框架提供的转换器。这样我就避免了查看相关程序集的引用。

关于c# - 如何对测试( View 模型)类中的方法调用进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com