gpt4 book ai didi

c# - 如果我们不通过单元测试验证私有(private)方法是否被调用,我们如何验证它们是否被调用?

转载 作者:太空狗 更新时间:2023-10-29 18:27:19 27 4
gpt4 key购买 nike

我不想再提起这个,但我真的想了解如何通过我的测试来保护某些东西。

我有一个公共(public)方法(如下),它在调用另一个实际执行某些操作的方法之前调用一个私有(private)方法。我想确保对私有(private)方法的调用不会被删除,因为这可能是灾难性的。我做了一些研究,here , here , 和 here ,他们都说不要测试私有(private)方法。我想我能理解这一点,但是我如何防止删除这行代码

如您所见,公共(public)方法返回void,因此我无法测试公共(public)方法调用的结果。我有直接测试 ApplicationShouldBeInstalled() 的单元测试。

public void InstallApplications()
{
foreach (App app in this._apps)
{
// This is the line of code that can't be removed. How can I make
// sure it doesn't get removed?
if (!ApplicationShouldBeInstalled(app)) { continue; }

// This simply can't run unless it passes the above call.
CommonUtility.Container.Resolve<IAppInstaller>().InstallApplication(this, app);
}
}

编辑 - 我根据 JerKimball 的回答接受了这个。

基本上,我只是使用一个 Mock 对象(来自 Moq),然后验证它的方法是否被调用了预期的次数。

[TestMethod()]
public void ApplicationShouldBeInstalledTest_UseCase13()
{
var mockAppInstaller = new Mock<IAppInstaller>();
mockAppInstaller.Setup(m => m.InstallApplication(It.IsAny<ApplicationServer>(),
It.IsAny<Application>()));
CommonUtility.Container.RegisterInstance<IAppInstaller>(mockAppInstaller.Object);

// Actual test code here

appServer.InstallApplications();
mockAppInstaller.Verify(x => x.InstallApplication(It.IsAny<ApplicationServer>(),
It.IsAny<Application>()), Times.Never());
}

我不能放手;那个编辑是丑陋的。尽管我必须创建一个实际的模拟类,但这种方法要简洁得多:

模拟实现:

public class MockAppInstaller : IAppInstaller
{
public bool Invoked { get; set; }

public void InstallApplication(ApplicationServer server, Application app)
{
this.Invoked = true;
}
}

测试方法:

[TestMethod()]
public void ApplicationShouldBeInstalledTest_UseCase14()
{
MockAppInstaller mockAppInstaller = new MockAppInstaller();
CommonUtility.Container.RegisterInstance<IAppInstaller>(mockAppInstaller);

// Actual test code here

appServer.InstallApplications();
Assert.AreEqual(true, mockAppInstaller.Invoked);
}

最佳答案

I want to make sure that the call to the private method doesn't get removed because that could be catastrophic.

这听起来应该很简单。灾难很容易被发现。所以运行一个调用公共(public)方法的测试,并检查是否发生了任何灾难性的事情。防止灾难发生的私有(private)方法中的代码实际上是运行公共(public)方法的可见副作用...而它是由于私有(private)方法调用的事实是 实现细节

所以在这种情况下,您基本上应该创建一个不应该安装的应用程序(无论出于何种原因),并在您调用 InstallApplications 时验证它安装。

关于c# - 如果我们不通过单元测试验证私有(private)方法是否被调用,我们如何验证它们是否被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14884531/

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