单元测试中的 IOC class - Unity.WebApi
IOC in UnitTest class - Unity.WebApi
我已经在 web api 项目中成功实现了 Unity.WebAPI。 MService class 的新实例未创建的一些方式。我在 运行 单元测试方法时收到以下错误消息。
Unable to get default constructor for class MServiceTests.
服务Class
private readonly IRepository _mRepository;
public MService(IMRepository mRepository)
{
_mRepository = mRepository;
}
public List<FUser> GetFUser()
{
result = _mRepository.ExecuteCommandReader()
}
测试Class
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>();
您在测试 class 中缺少 [TestClass] 属性(假设您使用的是 MSTest 框架)。
测试 classes 需要有一个空的默认构造函数或根本没有构造函数。
要设置测试,您可以按照您
的方式进行安排
- 手动创建所需实例或
- 使用模拟框架或
- 就像在您的应用程序中关于依赖注入一样进行相同的初始化,然后根据需要解析实例
也许您还想看一下单元测试的 Arrange-Act-Assert 模式:
(参见 http://defragdev.com/blog/?p=783)
另外请记住,您更想测试代码而不是 DI 框架。
关于如何对具有依赖性的 class 进行单元测试似乎有些混乱。
让我们假设被测对象看起来像这样
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
您将创建主题 class 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);
}
}
测试运行器无法创建测试的最初问题的原因 class 因为它(运行器)不是为 DI 构建的。
为了测试主题 class,您需要创建 class 的实例并注入测试被测方法行为所需的任何依赖项。
这么小的孤立测试真的没必要用容器
我已经在 web api 项目中成功实现了 Unity.WebAPI。 MService class 的新实例未创建的一些方式。我在 运行 单元测试方法时收到以下错误消息。
Unable to get default constructor for class MServiceTests.
服务Class
private readonly IRepository _mRepository;
public MService(IMRepository mRepository)
{
_mRepository = mRepository;
}
public List<FUser> GetFUser()
{
result = _mRepository.ExecuteCommandReader()
}
测试Class
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>();
您在测试 class 中缺少 [TestClass] 属性(假设您使用的是 MSTest 框架)。 测试 classes 需要有一个空的默认构造函数或根本没有构造函数。
要设置测试,您可以按照您
的方式进行安排- 手动创建所需实例或
- 使用模拟框架或
- 就像在您的应用程序中关于依赖注入一样进行相同的初始化,然后根据需要解析实例
也许您还想看一下单元测试的 Arrange-Act-Assert 模式: (参见 http://defragdev.com/blog/?p=783)
另外请记住,您更想测试代码而不是 DI 框架。
关于如何对具有依赖性的 class 进行单元测试似乎有些混乱。
让我们假设被测对象看起来像这样
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
您将创建主题 class 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);
}
}
测试运行器无法创建测试的最初问题的原因 class 因为它(运行器)不是为 DI 构建的。
为了测试主题 class,您需要创建 class 的实例并注入测试被测方法行为所需的任何依赖项。
这么小的孤立测试真的没必要用容器