作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在尝试在我们现有的 MVC 应用程序中添加单元测试。我们所有的 Controller 都继承了一个 BaseController
,如下所示:
public class BaseController : Controller
{
public virtual Tenant Tenant
{
get { return System.Web.HttpContext.Current.Items["Tenant"] as Tenant; }
}
}
现在,这里有一个示例 Controller 继承了 BaseController
并且运行良好:
public class DefaultController : BaseController
{
public ActionResult Index()
{
// TODO: repository calls
return View();
}
}
但是一旦我在上面的 Controller (下面给出)中添加 string tenantid = Tenant.Id;
,我的单元测试就会失败。
public class DefaultController : BaseController
{
public ActionResult Index()
{
// TODO: repository calls
string tenantid = Tenant.Id;
return View();
}
}
这看起来像 System.Web.HttpContext.Current.Items["Tenant"]
在单元测试运行期间为空,我如何在 BaseController
中分配该值单元测试?
最佳答案
当前 Controller 与实现问题 (HttpContext
) 紧密耦合,这使得很难单独对其进行单元测试。
检查当前设计并从 HttpContext.Current
解耦,它是 null
,因为单元测试时 IIS 不可用。
此外 Controller
已经有一个 HttpContext
属性
public HttpContextBase HttpContext { get; }
它试图通过使用能够被模拟的 HttpContextBase
来解耦。
可以通过 ControllerContext
访问和设置该属性。
所以首先更新 Controller 以使用本地 HttpContext
属性
public class BaseController : Controller {
public virtual Tenant Tenant {
get { return HttpContext.Items["Tenant"] as Tenant; }
}
}
现在 Controller 正在使用可以模拟的上下文,可以根据需要对其进行单元测试。
//Arrange
var tenant = new Tenant() {
//...
};
var mockHttpContext = new Mock<HttpContextBase>(); //USING MOQ
mockHttpContext.Setup(_ => _.Items["Tenant"]).Returns(tenant);
var controller = new DefaultController();
controller.ControllerContext =
new ControllerContext(mockHttpContext.Object, new System.Web.Routing.RouteData(), controller);
//Act
var result = controller.Index();
//Assert
//...
关于c# - 如何从 ASP.NET MVC 中的单元测试分配 BaseController 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54651982/
我是一名优秀的程序员,十分优秀!