2013-12-16 32 views
1

我有一個設置提供程序是不可測試的(公司遺留代碼)。我試圖將設置提供程序封裝在Settings Repository中以減少不可測試代碼的數量。因此,而不是有20個方法使用設置提供程序,我們將有1。其餘的實現SettingsRepository接口。存根/模擬2級別在一個類別中下降

雖然後來我做了測試,但通常表明我做了錯誤的測試。

我希望你能幫助找出什麼。

public class SettingsRepository : ISettingsRepository 
{ 
    public SettingsRepository() {Settings = Settings.Default; } 
    public Settings Settings { get; set; } 
} 

public interface ISettingsRepository 
{ 
    Settings Settings { get; set; } 
} 

我使用unity來注入存儲庫。我從存儲庫中獲取某些內容的方式如下:

_settingsRepository.Settings.SecureCache 

所以問題來了。我可以使用nsubstitute模擬/存根SettingsRepository接口,但我需要做的是實際模擬「設置」來設置SecureCache的返回。

有沒有一種方法來「深模擬」在nsubstitute這樣我就可以這樣做:

_settingsRepository.Settings.SecureCache.Returns("www.somepath.com"); 

目前「設置」爲空和我沒有什麼我可以嘲笑那裏。

我的回退解決方案是直接在SettingsRepository中添加所有設置字段,但我很想避免這種情況,因爲它只會在解決方案的其他地方移動不可測試的代碼。

回答

1

使用NSubstitue(版本1.5.0.0),您可以執行以下操作。您可以創建一個Settings實例(或者您甚至可以創建一個虛假實例),然後按照以下方式返回僞造的SecureCache。

public class SettingsRepository : ISettingsRepository { 
    public SettingsRepository() { Settings = Settings.Default; } 
    public Settings Settings { get; set; } 
} 

public interface ISettingsRepository { 
    Settings Settings { get; set; } 
} 

public class Settings { 
    public Settings Default { get; set; } 
    public string SecureCache { get; set; } 
} 

[TestFixture] 
public class TestClass 
{ 
    [Test] 
    public void Subject_Scenario_Expectation() 
    { 
     var repoStub = Substitute.For<ISettingsRepository>(); 
     repoStub.Settings.Returns(new Settings() { SecureCache = "www.somepath.com" }); 

     Assert.IsNotNull(repoStub.Settings); 
     Assert.IsNotNull(repoStub.Settings.SecureCache); 
    } 
} 
+0

聽起來像我在這裏的正確軌道。你可以擴展「假實例」部分嗎?設置是一個密封的類。感謝您的幫助 – mfriis

+2

很高興你問:)假實例意味着真實實例的替代版本。例如,我可以從實例繼承並創建自己的假版本。類FakeSettings:設置。然後你可以在單元測試中使用FakeSettings。由於它是密封的,你不能繼承。所以真正的實例會完成這項工作。到底我在代碼中有什麼。 – Spock