Stub / Mock在课堂上降低2级

时间:2013-12-16 09:28:07

标签: c# unit-testing mocking stub nsubstitute

我有一个不可测试的设置提供程序(公司遗留代码)。我正在尝试将设置提供程序包装在设置存储库中以减少不可测试代码的数量。因此,不是使用设置提供程序的20个方法,而是使用1.其余的实现SettingsRepository接口。

我之后无法进行测试,这通常表明我做错了什么。

我希望你能帮忙找出答案。

    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 个答案:

答案 0 :(得分: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);
    }
}