【问题标题】:How to mockup a base controller in asp.net mvc?如何在 asp.net mvc 中模拟基本控制器?
【发布时间】:2009-10-05 02:25:45
【问题描述】:

我制作了一个基本控制器,因此我可以轻松地将数据传递到母版页视图。然而,这个基本控制器将一个服务层传递给它,并且每次我运行我的单元测试时,这个服务层都会杀死它,因为它试图访问一些数据库内容。

  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);

我在 serviceLayer 界面中使用 moq 和其他东西来模拟存储库,但它似乎没有效果。

所以不知道该怎么办。

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc unit-testing


    【解决方案1】:

    与其模拟您的基本控制器,不如模拟服务层接口。例如,使用 MoQ 你可以这样做:

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

    一般的想法是,如果您正在测试您的控制器,您希望模拟它的依赖项。你想避免嘲笑你正在测试的东西。

    【讨论】:

    • 嗯。看到这就是我想知道我应该单独测试服务层吗?还是与控制器层结合使用?我之所以这么说是因为我的很多服务层的东西都有类似的验证方法。所以我想不妨通过视图发送验证数据,然后在最后测试模型状态是什么。因为像大多数视图一样,只是将值传递给服务层,然后有几个 if 语句来检查验证是否成功,并根据服务层的结果返回正确的视图。
    • 另外我发现我必须做很多模拟。曾经有人告诉我,如果你嘲笑太多,你就做错了。然而,我只是不明白如果不模拟它怎么可能。就像几乎每个方法都从数据库调用某些东西一样,或者使用一些内置的 asp.net 成员资格,比如(User.Identity...),如果你不模拟它,它似乎就死了。所以我只是不明白这是怎么回事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多