如何在C#中将类构造函数作为参数传递

时间:2019-11-27 22:53:01

标签: c#

我想为服务创建通用的单元测试类。我的基类尽可能通用,我想将Service构造函数作为参数从派生类传递给我的基类,但是我不知道如何在C#中做到这一点。

$remote_vnet => (2)

1 个答案:

答案 0 :(得分:1)

我认为工厂方法可以很好地为您服务。

将您的基类标记为抽象,并定义一个受保护的抽象方法,该方法具有与服务构造函数相同的签名。然后,在基类的设置逻辑中调用该方法。

您将必须为每个派生的测试类实现抽象方法,但我认为这是一个合理的折衷方案。

请注意,我还从测试类中删除了该接口。根据您提供的示例代码,现在抽象的基类完全多余。当然,出于某些原因(从您的示例中看不到)可能很有用-如果是这样,则可以保留它。

public class BaseServiceUnitTest<TEntity> where TEntity : BaseEntity
{
    private IBaseService<TEntity> _service;

    public BaseServiceUnitTest(Constructor ctor)
    {
        _service = Create(/* your mocked dependencies here */);
    }

    protected abstract IBaseServce<TEntity> Create(Dependency1 d1, Dependency2 d2);

    //...implemented methods from IBaseServiceUnitTest
}

public class CustomEntityServiceUnitTest : BaseServiceUnitTest<CustomEntity>
{
    // "arg1, arg2"
    protected override IBaseService<CustomEntity> Create(Dependency1 d1, Dependency2 d2) =>
        new BaseService<CustomerEntity>(d1, d2);
}

附录

如果您真的想使事情变得神奇,可以尝试回答this question。它将起作用,但是您将牺牲“ F12功能”(使用Visual Studio的快捷方式查找和浏览引用的能力)以及构造器及其参数的编译时验证。就个人而言,我可能会使用工厂方法。


附录2

出于完整性考虑,还值得一提的是,如果被测服务没有构造函数参数,则也许也可以使用new constraint。根据您的评论,听起来好像在这种情况下不行,但是下次可能会有用。