[英]ASP.NET MVC Controller Unit Testing - Problem with UrlHelper Extension
[英]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.