我有单元测试调用ApplicationShouldBeInstalled(app)
以确保它正常工作。下面的实际生产代码也调用了该方法,因此它不会意外安装应用程序。但是,没有什么能阻止开发人员删除完成检查的那行代码。而且我的单元测试不会捕捉到这一点,因为测试是在测试ApplicationShouldBeInstalled(app)
方法,而不是InstallApplications()
方法。
我无法InstallApplications()
从我的测试代码中调用,因为它会尝试安装应用程序。InstallApplication(app)
是同一个类中的一个方法,而不是另一个我可以用接口模拟它的类。有没有办法确保 InstallApplications() 始终执行该检查?我想我可以转移ApplicationShouldBeInstalled(app)
到另一个班级并模拟它,但是我只是为了测试/模拟而移动代码。有没有更好的办法?
public void InstallApplications()
{
foreach (App app in this._apps)
{
if (!ApplicationShouldBeInstalled(app)) { continue; }
InstallApplication(app);
}
}
模拟选项看起来像这样。将Container
在实时运行时返回真实的实现,并在运行测试时返回模拟。
public void InstallApplications()
{
foreach (App app in this._apps)
{
if (!ApplicationShouldBeInstalled(app)) { continue; }
Container.Resolve<IInstaller>().InstallApplication(app);
}
}