gpt4 book ai didi

c# - 使用 Moq 模拟 HttpApplicationState 时似乎无法设置对象

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:43 24 4
gpt4 key购买 nike

我有一个 Action 过滤器,它在过滤器上下文的 HttpContext 的 HttpApplicationState 中设置一个对象。我想在单元测试中使用此功能,但由于某种原因,该对象未设置在 HttpApplicationState 从中派生的基础 NameObjectCollectionBase 中。

我知道该功能有效,因为当我运行 MVC 应用程序时,它按预期工作。

如何设置我的测试以使其在应用程序状态下设置对象?我正在使用 Moq,这里是目前为止的一些代码。它失败了

Asset.IsNotNull(context.HttpContext.Application["config"]);

这是代码。

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
ControllerBase controller = filterContext.Controller;
if (!(controller is ApplicationController))
return;

ApplicationController applicationController = (ApplicationController) controller;

IDictionary<string, string> config;

// Loads the view configuration values.
if (filterContext.HttpContext.Application["config"] == null)
{
config = applicationController.ApplicationService.GetConfiguration();
filterContext.HttpContext.Application["config"] = config;
}
else
{
config = (IDictionary<string, string>) filterContext.HttpContext.Application["config"];
}

applicationController.ViewBag.BlogTitle = AddConfigurationValueToViewBag("BlogTitle", config);

}

这是到目前为止的测试。

[TestMethod]
public void ApplicationAttribute_OnActionExecuted_SetsConfigurationDctionaryInAppicationCache()
{
// Arrange
Mock<HttpContextBase> httpContext = new Mock<HttpContextBase>();

var mockApplicationState = new Mock<HttpApplicationStateBase>();
httpContext.Setup(h => h.Application).Returns(mockApplicationState.Object);

ApplicationController applicationController = new BlogController(null, null, MocksAndStubs.CreateMockApplicationService());

Mock<ActionExecutedContext> actionExecutedContext = new Mock<ActionExecutedContext>();
actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object);
actionExecutedContext.SetupGet(c => c.Controller).Returns(applicationController);

// Act
ApplicationAttribute applicationAttribute = new ApplicationAttribute();
ActionExecutedContext context = actionExecutedContext.Object;
applicationAttribute.OnActionExecuted(context);

// Assert
Assert.IsNotNull(context.HttpContext.Application["config"]);
}

最佳答案

看起来您希望您的模拟对象或多或少像真实对象一样。它不是那样工作的;模拟只会做你告诉它做的事,仅此而已。如果您在调用 . . .

context.HttpContext.Application["config"]

. . .那么它根本不会。如果您确实设置了模型以返回特定的内容,这将违背测试的目的。

在没有任何额外的了解或您的情况(您的测试策略的“内容”和“原因”)的情况下,看起来您正在尝试确保调用应用程序状态上的集合。我建议做一个 mockApplicationState.Verify() 作为你的断言来测试集合 happened,而不是测试对象本身的结果状态。

编辑:Verify() 允许您断言/确保方法(或属性方法)被调用,有条件或无条件。这应该让你开始:

http://code.google.com/p/moq/wiki/QuickStart#Verification

所以你的验证看起来像(完全未经测试!):

mockApplicationState.Verify(x => x["config"] == [expected value], Times.Once());

如果 mockApplicationState["config"] 被设置为预期值少于一次或多次,这基本上表示测试失败。

我假设 HttpApplicationStateBase 没有被密封。如果是,则上述可能会引发异常。

关于c# - 使用 Moq 模拟 HttpApplicationState 时似乎无法设置对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232233/

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