gpt4 book ai didi

asp.net-mvc - 单元测试 Controller.Initialize

转载 作者:行者123 更新时间:2023-12-05 00:01:20 26 4
gpt4 key购买 nike

我在我创建的基本 Controller 的初始化方法中将线程文化设置为通过 HttpRequest 上的 cookie 发送的文化。我现在想为此功能创建一个单元测试。

在测试中,我创建了一个模拟 HttpContext 并添加了 Cookie。使用这个和一个 routeData 助手,我创建了一个 RequestContext。然后我创建一个新的 Controller 并在它上调用 Execute 并传入 RequestContext。

我首先遇到了一个关于 TempData 和 SessionState 的问题,我通过设置 TempData 并在 Controller 上创建了 EmptyTempDataProvider 来解决这个问题。

然后我遇到了 VirtualPathProviderViewengine 的问题,我通过创建 VoidActionInvoker 解决了这个问题。

这是测试初始化​​方法的最佳方法吗?有没有做类似的事情并愿意分享一些代码?

谢谢,
乔恩

namespace MyApp.UnitTests {
[TestClass]
public class ControllerTests {
[TestInitialize]
public void Setup() {
RouteTable.Routes.Clear();
MyApp.MvcApplication.RegisterRoutes(RouteTable.Routes);
}

[TestMethod]
public void Thread_culture_should_be_set_to_cookie_culture() {
// Arrange
var context = HttpMockHelper.FakeHttpContext();
context.Request.Cookies.Add(new HttpCookie(CultureService.CookieName, "nl-NL"));
var reqContext = new RequestContext(context, "~/Home/Landing".Route());
var controller = new HomeController {
TempData = new TempDataDictionary(),
TempDataProvider = new EmptyTempDataProvider(),
ActionInvoker = new VoidActionInvoker()
};

// Act
(controller as IController).Execute(reqContext);

// Assert
Assert.AreEqual("nl-NL", Thread.CurrentThread.CurrentCulture.Name);
}
}

internal class VoidActionInvoker : ControllerActionInvoker {
protected override ActionExecutedContext InvokeActionMethodWithFilters(System.Reflection.MethodInfo methodInfo, IDictionary<string, object> parameters, IList<IActionFilter> filters) {
return new ActionExecutedContext(this.ControllerContext, false, null);
}

protected override void InvokeActionResult(ActionResult actionResult) {
}
}

internal class EmptyTempDataProvider : ITempDataProvider {
public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) {
}

public IDictionary<string, object> LoadTempData(ControllerContext controllerContext) {
return new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
}
}
}

最佳答案

对我来说听起来不错,初始化方法需要一个需要 HttpContext 的 requestcontext 参数,如果我的帖子正确,你正在模拟这些对象并添加你想要测试的值,然后确保你的方法正常工作.听起来和我会做的完全一样。我不介意看到一些代码。

编辑:你的测试对我来说看起来不错。

关于asp.net-mvc - 单元测试 Controller.Initialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/447853/

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