加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 我的ASP.NET MVC控制器应该如何识别存储库

发布时间:2020-12-16 07:03:26 所属栏目:asp.Net 来源:网络整理
导读:我试图了解如何对通过某种存储库访问数据的ASP.NET MVC项目进行单元测试. 在单元测试期间,我显然想要创建一个模拟存储库但是如何将这个模拟存储库传递给正在测试的Controller实例?另外,真正连接到数据库的实际存储库如何找到控制器的路径? 我是否只是通过
我试图了解如何对通过某种存储库访问数据的ASP.NET MVC项目进行单元测试.

在单元测试期间,我显然想要创建一个模拟存储库但是如何将这个模拟存储库传递给正在测试的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的默认控制器构造策略,即需要无参数构造函数.因此,您可以让控制器明确说明其依赖关系(最好是接口).这些接口如何映射到具体实例是DI容器的业务,您可以在Global.asax.cs(实时)或测试夹具设置(用于单元测试)中配置.

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

例如,如果您要使用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 =依赖倒置(这两个术语经常互换使用,这不是真正正确的IMO)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读