【发布时间】:2013-02-14 19:49:41
【问题描述】:
我有单元测试调用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);
}
}
【问题讨论】:
-
能不能从方法中提取一个接口,然后mock这个接口?
-
如果我理解正确,那是我在问题中列出的选项。所以,是的,我可以,但我想知道是否有更好的方法。 IMO,所有这些代码都属于它当前所在的类。不过,如果我必须这样做才能对其进行测试,我会移动它。
标签: c# unit-testing mocking