gpt4 book ai didi

c# - UnitTest 类中的 IOC - Unity.WebApi

转载 作者:太空宇宙 更新时间:2023-11-03 22:39:09 24 4
gpt4 key购买 nike

我已经在 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)测试被测方法行为所需的任何依赖项。

这么小的孤立测试真的没必要用容器

关于c# - UnitTest 类中的 IOC - Unity.WebApi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com