我有單元測試調用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