如何在ASP.NET MVC中模拟基础控制器?

3

我有一个基础控制器,可以轻松地将数据传递到主页面视图。但是这个基础控制器会接收一个服务层,每次运行单元测试时,由于该服务层尝试访问一些数据库内容,因此会导致崩溃。

  private ServiceLayer service;

        public ApplicationController():this(new ServiceLayer())
        {
        }

        public PlannerApplicationController(IServiceLayer serviceS)
        {
            service= serviceS;           
        }

        protected override void Initialize(RequestContext requestContext)
        {

            base.Initialize(requestContext);
          // some stuff gets called here.
        }

服务层首先调用的是:

   public ServiceLayer ()
            : this(new Repository())
        {

        }

// 为 DI 再添加一个构造函数。

当我运行我的测试并访问继承此基础控制器的控制器时,一旦到达控制器的构造函数,似乎会调用此基础控制器。

因此,在我的单元测试中,我尝试通过以下方式模拟基础控制器

baseController = new ApplicationController(SerivceLayerInterface);

我使用 moq 等工具来模拟服务层接口中的存储库,但似乎没有任何效果。

所以不知道该怎么办。

1个回答

3

不要模拟您的基本控制器,为什么不模拟服务层接口呢?例如,使用MoQ,您可以执行以下操作:

var serviceMock = new Mock<IServiceLayer>();
//serviceMock.Setup(s => s.SomeMethodCall()).Returns(someObject);
var controller = new BaseController(serviceMock.Object);

一般情况下,如果你正在测试控制器,你需要模拟其依赖项。你应该避免模拟你正在测试的东西本身。

嗯,我一直在想,我应该单独测试服务层还是与控制器层一起测试?我这么说的原因是我的许多服务层代码中都有验证方法。所以我想,不如将验证数据通过视图发送,然后在最后测试模型状态中的内容。因为大部分视图只是将值传递给服务层,然后使用几个if语句检查验证是否成功,并根据服务层的结果返回正确的视图。 - chobo2
另外,我一直发现自己必须进行大量的模拟。有人曾经告诉我,如果你需要进行过多的模拟,那么你一定做错了什么。然而,我就是不明白如果不进行模拟怎么可能完成开发。几乎每个方法都要从数据库中调用某些内容,或者使用内置的ASP.NET成员身份验证(例如User.Identity...),如果不进行模拟测试就会出错。所以我真的不明白那种说法是怎么回事。 - chobo2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接