我已经成功地在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框架(。测试类需要有一个空的默认构造函数,或者根本没有构造函数。
对于设置测试,您可以按照的方式进行安排
- 手动创建所需的实例或
- 使用嘲讽框架或
- 执行与应用程序中关于依赖项注入相同的初始化,然后根据需要解析实例
也许您还想看看单元测试的Arrange-Act-Assert模式:(参见http://defragdev.com/blog/?p=783)
还要记住,您更希望测试代码,而不是DI框架。