Stub/Mock在一节课中降低2级

本文关键字:2级 一节课 Mock Stub | 更新日期: 2024-10-19 13:05:17

我有一个不稳定的设置提供程序(企业遗留代码)。我正在尝试将设置提供程序包装在设置存储库中,以减少不稳定的代码量。因此,我们将有1个方法,而不是使用设置提供程序的20个方法。其余部分实现SettingsLocation接口。

不过,我在事后的测试中遇到了麻烦,这通常表明我做错了什么。

我希望你能帮我弄清楚。

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

我使用统一来注入存储库。我从存储库中获取内容的方式如下:

_settingsRepository.Settings.SecureCache

所以问题来了。我可以使用nsubstitle模拟/存根SettingsLocation接口,但实际上我需要做的是模拟"Settings"来设置SecureCache的返回。

有没有一种方法可以在nsubstute中"深度模拟",这样我就可以做一些类似的事情:

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

目前"设置"为空,我没有任何可以嘲笑的东西。

我的后备解决方案是将所有设置字段直接添加到Settingspository中,但我希望避免这种情况,因为它只会将不稳定的代码移动到解决方案中的其他位置。

Stub/Mock在一节课中降低2级

使用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);
    }
}