我已经在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>();
答案 0 :(得分:2)
关于如何对具有依赖项的类进行单元测试似乎有些困惑。
让我们假设被测对象看起来像这样
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模拟框架对依赖项进行模拟。如果需要,您可以轻松地创建一个伪造的实现。
[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而构建的。
为了测试主题类,您需要创建该类的实例,并注入测试测试方法的行为所需的所有依赖项。
真的不需要使用容器进行如此小的隔离测试
答案 1 :(得分:1)
您缺少测试类的[TestClass]属性(假设您正在使用MSTest框架)。 测试类需要具有一个空的默认构造函数,或者根本不需要任何构造函数。
要设置测试,您可以按照自己的方式安排
也许您还想看看单元测试的Arrange-Act-Assert模式: (请参阅http://defragdev.com/blog/?p=783)
还请记住,您只想测试代码而不是DI框架。