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

asp.net-mvc – 如何在没有IoC容器的情况下对您的控制器进行单元

发布时间:2020-12-16 03:53:25 所属栏目:asp.Net 来源:网络整理
导读:在构建我最新的ASP.NET MVC项目时,我开始进入单元测试,依赖注入和所有爵士乐. 我现在想要单元测试我的控制器,我很难搞清楚如何在没有IoC容器的情况下正确地执行此操作. 以一个简单的控制器为例: public class QuestionsController : ControllerBase{ privat
在构建我最新的ASP.NET MVC项目时,我开始进入单元测试,依赖注入和所有爵士乐.

我现在想要单元测试我的控制器,我很难搞清楚如何在没有IoC容器的情况下正确地执行此操作.

以一个简单的控制器为例:

public class QuestionsController : ControllerBase
{
    private IQuestionsRepository _repository = new SqlQuestionsRepository();

    // ... Continue with various controller actions
}

由于它直接实例化SqlQuestionsRepository,因此该类不是单元可测试的.那么,让我们沿着Dependancy Injection路线行进并做:

public class QuestionsController : ControllerBase
{
    private IQuestionsRepository _repository;

    public QuestionsController(IQuestionsRepository repository)
    {
        _repository = repository;
    }
}

这似乎更好.我现在可以使用模拟IQuestionsRepository轻松编写单元测试.但是,现在要实例化控制器的是什么?在调用链SqlQuestionRepository的某个地方必须进行实例化.似乎我只是简单地将问题转移到别处,而不是摆脱它.

现在,我知道这是一个很好的例子,IoC容器可以通过为我配置控制器依赖性来帮助您,同时保持我的控制器易于单元测试.

我的问题是,如何在没有IoC容器的情况下对这种性质的东西进行单元测试?

注意:我不反对IoC容器,我很快就会走这条路.但是,我很好奇对于那些不使用它们的人来说,替代方案是什么.

解决方法

是不是可以保持字段的直接实例化并提供setter?在这种情况下,您只需在单元测试期间调用setter.像这样的东西:

public class QuestionsController : ControllerBase
{
    private IQuestionsRepository _repository = new SqlQuestionsRepository();

    // Really only called during unit testing...
    public QuestionsController(IQuestionsRepository repository)
    {
        _repository = repository;
    }
}

我不太熟悉.NET,但作为Java的旁注,这是重构现有代码以提高可测试性的常用方法. I.E.,如果您有已经在使用的类并且需要修改它们以便在不破坏现有功能的情况下提高代码覆盖率.

我们的团队之前已经这样做了,通常我们将setter的可见性设置为package-private并保持测试类的包相同,以便它可以调用setter.

(编辑:李大同)

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

    推荐文章
      热点阅读