gpt4 book ai didi

unit-testing - 使用多个构造函数参数模拟和测试类

转载 作者:行者123 更新时间:2023-12-01 10:10:58 25 4
gpt4 key购买 nike

我的服务层类是为构造函数注入(inject)设置的。在模拟和测试这些类时,如何避免必须传入 null对于我不会在测试中使用的参数?

我试图避免的示例代码:

[TestFixture]
public class SomeServicesTests
{
SomeServices _someServices;

[SetUp]
public void Initialize()
{
_someServices= new SomeServices (null,
new StubRepositoryOne(),
null,
null,
new StubRepositoryTwo(),
null,
null,
null,
null);

}

[Test]
public void Test_Something()
{
string input = "yes";
string exptectedOutput = "no";

string output = _someServices.SomeFunction(input); // uses StubRepositoryOne and StubRepositoryTwo
Assert.AreEqual(exptectedOutput, output);
}
}

最佳答案

在它已经被接受之后添加我的答案,但是......

仅需要为测试传递一些依赖项这一事实表明可能存在设计问题。一个很好的试金石是一个类型中的所有字段都应该在每个方法中使用——很难一直这样做——但如果你不能这样做,这意味着这个类可能会被分解成具有更精细职责的更小的类.当您分解它们时,每个类将只采用它们立即需要的依赖项。

另一方面,如果您在这里所做的是手动服务定位器,并且您只测试功能的子集,您可能需要考虑创建仅测试构造函数。如:

internal SomeServices(IServiceOne one, IServiceTwo two)
{
}

或者使用 getter/setter 公开服务并进行相应的分配。同样,此处的 internal 关键字可用于保持您的设计意图干净:
public IServiceOne One
{
get { return _one; }
internal set { _one = value; }
}

当然,您希望将 InternalsVisibleTo 属性添加到您的代码中,以允许您的测试访问这些内部方法。

关于unit-testing - 使用多个构造函数参数模拟和测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com