gpt4 book ai didi

asp.net-mvc - 我的 ASP.NET MVC Controller 应该如何了解存储库

转载 作者:行者123 更新时间:2023-12-02 12:57:15 25 4
gpt4 key购买 nike

我正在尝试了解如何对通过某种存储库访问数据的 ASP.NET MVC 项目进行单元测试。

在单元测试期间,我显然想要创建一个模拟存储库,但是如何将此模拟存储库传递给正在测试的 Controller 实例?另外,真正连接到数据库的实际存储库如何找到通往 Controller 的路径?

我是否只是通过构造函数来完成此操作,如下所示?我认为这就是我应该如何设置我的 Controller ,但我想确认这是正确的:

public class SampleController : Controller
{
private IRepository _repo;

//Default constructor uses a real repository
// new ConcreteRepo() could also be replaced by some static
// GetRepository() method somewhere so it would be easy to modify
//which concrete IRepository is being used
public SampleController():this(new ConcreteRepo())
{

}

//Unit tests pass in mock repository here
public SampleController(IRepository repo)
{
_repo = repo;
}
}

最佳答案

正如每个人都已经说过的,您将需要使用 IoC* 或 DI** 容器。但他们没有说的是为什么会出现这种情况。

这个想法是,DI 容器将让您绕过 ASP.NET MVC 需要无参数构造函数的默认 Controller 构造策略。因此,您可以让 Controller 明确声明它们的依赖关系(最好作为接口(interface))。这些接口(interface)如何映射到具体实例就是 DI 容器的业务,并且您将在 Global.asax.cs(实时)或测试装置设置(用于单元测试)中进行配置。

这意味着您的 Controller 不需要了解其依赖项的具体实现,因此我们遵循依赖倒置原则:“高级模块不应依赖于低级模块.两者都应该依赖于抽象。”

例如,如果您要使用 AutoFac,您将执行以下操作:

// In Global.asax.cs's Application_Start
using Autofac;
using Autofac.Integration.Mvc;

var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.Register<IRepository>(() => new ConcreteRepo());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

// In your unit test:
var controllerInstance = new SampleController(new InMemoryFakeRepo());

// In SampleController
public class SampleController : Controller
{
private readonly IRepository _repo;

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

// No parameterless constructor! This is good; no accidents waiting to happen!
// No dependency on any particular concrete repo! Excellent!
}

* IoC = 控制反转
** DI = 依赖倒置
(这两个术语经常互换使用,在我看来这并不正确)

关于asp.net-mvc - 我的 ASP.NET MVC Controller 应该如何了解存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5798619/

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