我有单元测试调用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);
}
}
你可以从方法提取一个接口,然后模拟接口? – Robert 2013-02-14 19:52:56
欲了解更多信息,请参阅http://msdn.microsoft.com/en-us/library/fb3dyx26.aspx – 2013-02-14 19:54:04
如果我的理解正确,那是我在我的问题中列出的选项。所以,是的,我可以,但我想知道是否有更好的方法。国际海事组织,所有这些代码都属于它目前所在的班级。我会移动它,如果这是我必须做的才能够测试它。 – 2013-02-14 19:54:22