IOC in UnitTest class - Unity.WebApi



我已经成功地在web api项目中实现了Unity.WebAPI。一些MService类的新实例并没有被创建。当我运行单元测试方法时,我收到以下错误消息。

无法获取类MServiceTests的默认构造函数。

服务类别

private readonly IRepository _mRepository;
public MService(IMRepository mRepository)
{
_mRepository = mRepository;
}
public List<FUser> GetFUser()
{
result = _mRepository.ExecuteCommandReader()
}

测试类

public class MServiceTests
{
private readonly IMRepository _mRepository;
private readonly IMService _mService;

public MServiceTests(IMRepository mRepository, IMService mService)
{
_mRepository = mRepository;
_mService = mService;
}


[TestMethod]
public void Get_Users_ReturnsUserList()
{
var resultList = new List<FUser>();
resultList = _mService.GetFUser();
Assert.IsTrue(resultList.Count > 0);
}
}

UnityConfig

container.RegisterType<IFService, FService>(new HierarchicalLifetimeManager());
container.RegisterType<IMService, MService>(new HierarchicalLifetimeManager());
container.RegisterType<ITransactionService, TransactionService>(new HierarchicalLifetimeManager());
container.RegisterType<IMRepository, MRepository>();

对于如何对具有依赖关系的类进行单元测试,似乎有一些困惑。

让我们假设受试者看起来像这个

public class MService: IMService {
private readonly IMRepository mRepository;
public MService(IMRepository mRepository) {
this.mRepository = mRepository;
}
public List<FUser> GetFUser() {
var result = mRepository.ExecuteCommandReader();
return result
}
}

为了测试MService.GetFUser,您将创建主题类MService的一个实例,并注入测试所测试方法的行为所需的依赖项。

在下面的示例测试中,将使用Moq-mocking框架来模拟依赖关系。如果需要的话,您可以很容易地创建一个伪实现。

[TestClass]
public class MServiceTests {   
[TestMethod]
public void Get_Users_ReturnsUserList() {
//Arrange 
var expected = new List<FUser>() {
//populate with some users
};
IMRepository mockRepository = new  Mock<IMRepository>();
mockRepository.Setup(_ => _.ExecuteCommandReader()).Returns(expected);
IMService mService = new MService(mockRepository.Object);
//Act
var resultList = mService.GetFUser();
//Assert
Assert.IsTrue(resultList.Count > 0);    
}
}

最初出现问题的原因是测试运行程序无法创建测试类,因为它(运行程序(不是为执行DI而构建的。

为了测试主题类,您需要创建该类的实例,并注入测试被测方法行为所需的任何依赖项。

真的没有必要使用容器进行这样一个小型的隔离测试

您缺少测试类上的[TestClass]属性(假设您使用的是MSTest框架(。测试类需要有一个空的默认构造函数,或者根本没有构造函数。

对于设置测试,您可以按照的方式进行安排

  1. 手动创建所需的实例或
  2. 使用嘲讽框架或
  3. 执行与应用程序中关于依赖项注入相同的初始化,然后根据需要解析实例

也许您还想看看单元测试的Arrange-Act-Assert模式:(参见http://defragdev.com/blog/?p=783)

还要记住,您更希望测试代码,而不是DI框架。

最新更新