繁体   English   中英

单元测试ASP.NET MVC控制器操作tryupdate

[英]Unit testing asp.net mvc controller action tryupdate

我想测试控制器的动作,但是Visual Studio Code Coverage工具没有涵盖这一点。

    public ActionResult Activate(int? id)
    {
        if (id == null)
            return View("PageNotFound");

        var city = repository.GetCityById(id.Value);

        if (city == null)
            return View("PageNotFound");


        city.IsActive = !city.IsActive;

        if (TryUpdateModel(city))
        {
            repository.Save();
            return RedirectToAction("MyCities");
        }

        ***return View("PageNotFound");***
    }

在代码覆盖率中, * return View(“ PageNotFound”); *不包括在内。 因为,我无法模拟TryUpdateModel错误的状态。 如果无法更新模型,则TryUpdateModel可能为false。 您能帮上忙吗?

如果模型验证失败, TryUpdateModel将返回false。
(在这种情况下,您不应显示未找到的页面)

在这种情况下,您会遇到各种各样的选择。 其中之一是创建一个存根,该存根将覆盖您要控制的方法的实际功能。

例如,您可以将TryUpdateModel声明为虚拟的。 在单元测试中,您不必继承原始类,而是继承它并重写TryGetModel以简单地返回false。 所有其他功能保持不变。

现在,您可以在派生类上调用Activate方法,该方法具有与模拟的TryUpdateModel方法完全相同的功能,从而使您可以测试所需的用例,而不会像模拟某个执行路径那样TryUpdateModel

这种技术并非没有缺点:它使您仅出于测试目的将方法声明为虚拟方法,从而防止将其密封或静态化。 还有其他更高级的技术( Mock对象隔离框架 ),但是我认为这对于这种情况已经足够了。

您没有包括显示如何处理货运依赖项的生存期的代码,所以我只是在猜测,但是...

作为测试设置的一部分,应该可以将此类的模拟或伪造实例传递给控制器​​(如果当前无法实现,请重构直到可以)。

使用适当的模拟,您可以根据需要隔离和测试行为。

另外:我不同意@dreza的评论...测试这种业务逻辑非常重要。

我还要提醒您,不要假冒@Vitaliy所建议的TryUpdateModel的实现,毕竟,您要测试货物模型无效时会发生什么(不仅仅是假装它是通过提供新版本的核心代码来实现的)。

好,我解决了。 如果条件,我删除了TryUpdatemodel。 直接使用repository.Save()方法。 因为我没有发送参数模型来激活方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM