我讨厌再次提出这个问题,但我真的很想了解如何通过我的测试来保护某些东西。
我有一个公共方法(如下),它在调用另一个实际执行某些操作的方法之前调用一个私有方法。我想确保不会删除对私有方法的调用,因为这可能是灾难性的。我已经做了一些研究,这里,这里和这里,他们都说不要测试私有方法。我想我可以理解,但是我该如何防止删除这行代码呢?
可以看到,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);
}