gpt4 book ai didi

c# - 如何从 ASP.NET MVC 中的单元测试分配 BaseController 值

转载 作者:行者123 更新时间:2023-11-30 21:30:09 26 4
gpt4 key购买 nike

我们正在尝试在我们现有的 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();
}
}

enter image description here

这看起来像 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com