gpt4 book ai didi

c# - 模拟 ApiController

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:43 26 4
gpt4 key购买 nike

我正在尝试测试我制作的 WebApi Controller 。我尝试使用依赖注入(inject)来简化测试。尽管它实际上有相反的效果。

我目前有一个 Controller 在其构造函数中采用 repo 接口(interface)。 repo 接口(interface)也在其构造函数中采用 DbContext 接口(interface)。我是否正确地认为我需要模拟 DbContext,并在模拟 repo 协议(protocol)时将模拟的上下文作为参数传递,然后将该模拟的 repo 协议(protocol)传递到我正在测试的 Controller 的实际实现中?

我正在使用 Moq 和 NUnit。

谢谢

最佳答案

我假设您在谈论单元测试,因为您正在使用模拟。

您不需要比您单元测试所依赖的类的第一级接口(interface)更深入地模拟。在您的示例中,您的 Controller 依赖于我们调用IRepository 的接口(interface)。您对 IRepository实现 反过来接受一个 IDbContext。请注意上一句中的粗体/斜体,只要您模拟的接口(interface)是 IRepository,那么 IDbContext 就不会以任何方式相关 - IDbContext 是您的具体存储库的依赖项,而不是您的 IRepository

您的 IRepository 应该拥有您的 Controller 模拟与单元测试 Controller 相关的数据/行为所需的一切。

例子:

public class MyController : MyController
{
private readonly IRepository _repo;

public MyController(IRepository repo)
{
_repo = repo;
}

public IActionResult GetData(string userId)
{
var data = _repo.GetUserInformation(userId);
var someTransformation = null; // transform data
return View(someTransformation);
}
}

public interface IRepository
{
MyObject GetData(string userId);
}

public class Repository : IRepository
{
private readonly IDbContext _iDbContext;

public Repository(IDbContext iDbContext)
{
_iDbContext = iDbContext;
}

public MyObject GetUserInformation(string userId)
{
return _iDbContext.MyObjects.Where(w => w.UserId == userId);
}
}

public interface IDbContext
{
// impl
}

public class DbContext : IDbContext
{
// impl
}

为了测试 MyController,您依赖接口(interface) IRepository。反过来,IRepository (Repository) 的实现依赖什么并不重要,因为这与测试 MyController 的范围无关。

在你的测试中:

public class MyControllerTests
{
public void MyTest()
{
Mock<IRepository> mockRepo = new Mock<IRepository>();
mockRepo
.Setup(s => s.GetUserInformation(It.IsAny<string>())
.Returns(new MyObject()
{
UserId = "whatever", // or whatever the mocked data needs to be
DateCreated = DateTime.MinValue
});
}
}

在上面的测试中,我们提供了调用 GetUserInformationIRepository 应该返回的示例数据,我们不依赖于实际的 DbContext,甚至是 IDbContext,因为 IRepository 只是定义了一个约定“当使用字符串调用 GetUserInformation 时,它应该返回一个 MyObject”。如何做到这一点并不重要。

关于c# - 模拟 ApiController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38354764/

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