我已经在 web api 项目中成功实现了 Unity.WebAPI。一些 MService 类的新实例没有被创建。我在运行单元测试方法时收到以下错误消息。
Unable to get default constructor for class 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);
}
}
Unity配置
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 的实例,并注入(inject)测试方法行为所需的任何依赖项测试。
在下面的示例测试中,将使用 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 而构建的。
为了测试主题类,您需要创建该类的实例并注入(inject)测试被测方法行为所需的任何依赖项。
这么小的孤立测试真的没必要用容器
