我想为服务创建通用的单元测试类。我的基类尽可能通用,我想将Service构造函数作为参数从派生类传递给我的基类,但是我不知道如何在C#中做到这一点。
$remote_vnet => (2)
答案 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的快捷方式查找和浏览引用的能力)以及构造器及其参数的编译时验证。就个人而言,我可能会使用工厂方法。
出于完整性考虑,还值得一提的是,如果被测服务没有构造函数参数,则也许也可以使用new
constraint。根据您的评论,听起来好像在这种情况下不行,但是下次可能会有用。