【问题标题】:Dependency Injection using NSubstitute使用 NSubstitute 进行依赖注入
【发布时间】:2019-07-02 12:11:47
【问题描述】:

我有一个服务类,它有一个使用 IAppConfig 的构造函数注入。 IAppConfig 有几个只有 getter 的属性。我想在我的测试项目中创建这个服务类的一个实例。

我的服务类

IAppConfig _appConfig;
public class PeopleService(IAppConfig appConfig)
{
   _appConfig = appConfig;
}

AppConfig 接口

public interface IAppConfig
{
   string BaseURL {get;}
   string AnotherProperty {get;}
}

如何使用 NSubstitute 模拟 IAppConfig 来创建 PeopleService 的实例。

我试过下面的代码,但是我设置的属性是空字符串。

var _appConfig = Substitute.For<IAppConfig>();
_appConfig.BaseURL.Returns("http://localhost");
new PeopleService(_appConfig);

但是 _appConfig 中设置的属性不起作用。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 文档中使用的属性确实有 { get; set; } 所以它可能不起作用,因为缺少一个 setter?
  • 它是一个只读属性,这意味着我们没有公共设置器。但是我们应该能够在类中设置它。我在接口的实际实现中已经这样做了
  • 当然,我明白这一点。我的建议是尝试添加set; 看看它是否有效。谁知道呢,可能不支持。
  • @LibinJoseph 解释不工作是什么意思。显示预期和实际发生的情况。说它不起作用并不能告诉我们任何可以帮助你的东西。
  • 如果没有 minimal reproducible example 澄清您的具体问题或其他详细信息以准确突出您需要什么,就很难重现问题,从而更好地理解所询问的内容。

标签: c# unit-testing dependency-injection mocking nsubstitute


【解决方案1】:

显示这个,因为这太多了,无法发表评论。

这个简化的示例表明该框架按预期工作,您需要更好地阐明您的实际问题。

[TestClass]
public class MyTestClass {
    [TestMethod]
    public void NSubstitute_Mocking_ReadOnly_Properties_Works() {
        //Arrange
        var expected = "http://localhost";
        var _appConfig = Substitute.For<IAppConfig>();
        _appConfig.BaseURL.Returns(expected);
        var subject = new PeopleService(_appConfig);

        //Act
        var actual = subject.URL;

        //Assert
        actual.Should().Be(expected);
    }
}

class PeopleService {
    IAppConfig _appConfig;
    public PeopleService(IAppConfig appConfig) {
        _appConfig = appConfig;
    }
    public string URL => _appConfig.BaseURL;
}

public interface IAppConfig {
    string BaseURL { get; }
    string AnotherProperty { get; }
}

上面的例子测试通过了。

【讨论】:

猜你喜欢
  • 2015-09-26
  • 2014-01-19
  • 2014-03-25
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多