模拟HttpContext.GetGlobalResourceObject()返回null

本文关键字:返回 null HttpContext GetGlobalResourceObject 模拟 | 更新日期: 2023-09-27 18:30:01

需要您的帮助来模拟HttpContext.GetGlobalResourceObject(),这样我就可以对我的助手类进行单元测试。我可以模拟HttpContextBase,但由于某种原因,在调试单元测试时HttpContext.GetGlobalResourceObject()始终为空(注意到HttpContext.Current为空)。如何解决此问题?

这是我的静态HelperClass

public static class HtmlHelperExtentions
{
    public static string GetBrandedCssBundle(this HtmlHelper htmlHelper)
    {
        return "BrandTest";
    }
    public static HtmlString Translate(this HtmlHelper htmlhelper, string defaultString, string key, params object[] objects)
    {
        var resource = HttpContext.GetGlobalResourceObject(null, key);
        if (resource != null)
        {
            defaultString = resource.ToString();
        }
        return objects.Length > 0 ? new HtmlString(string.Format(defaultString, objects)) : new HtmlString(defaultString);
    }
}

这是我的单元测试

[TestClass]
public class HtmlHelperTest
{
    Mock<HttpContextBase> contextBase {get;private set;};
    [TestInitialize()]
    public void Initializer()
    {
        var context = new Mock<HttpContextBase>();
        var request = new Mock<HttpRequestBase>();
        var response = new Mock<HttpResponseBase>();
        var session = new Mock<HttpSessionStateBase>();
        var server = new Mock<HttpServerUtilityBase>();
        var user = new Mock<IPrincipal>();
        var identity = new Mock<IIdentity>();
        context.Setup(ctx => ctx.Request).Returns(request.Object);
        context.Setup(ctx => ctx.Response).Returns(response.Object);
        context.Setup(ctx => ctx.Session).Returns(session.Object);
        context.Setup(ctx => ctx.Server).Returns(server.Object);
        context.Setup(ctx => ctx.User).Returns(user.Object);
        user.Setup(ctx => ctx.Identity).Returns(identity.Object);
        identity.Setup(id => id.IsAuthenticated).Returns(true);
        identity.Setup(id => id.Name).Returns("test");
        context.Setup(ctx => ctx.Response.Cache).Returns(CreateCachePolicy());
        contextBase = context;
    }
    [TestCleanup]
    public void TestCleanup()
    {
        HttpContext.Current = null;
    }

    [TestMethod]
    [TestCategory(TestCategoryType.UnitTest)]
    public void HtmlHelperExtentions_Translate_WithValidInputs_ReturnsTranslatedContent()
    {
        // Arrange          
        var defaultstring = "TestMessage";
        var inputkey = "XX.Areas.Onboarding.{0}Messages.Message_Onboarding_XX_1001";
        var expectedvalue = "HolaMessage";
        HtmlHelper htmlhelper = null;
        contextBase.Setup(ctx => ctx.GetGlobalResourceObject(null, 
        inputkey)).Returns(expectedvalue);
        //Act
        var result = HtmlHelperExtentions.Translate(htmlhelper, null, inputkey);
        //Assert            
        Assert.IsNotNull(result);
        Assert.AreEqual(expectedvalue, result.ToString());
    }
}

模拟HttpContext.GetGlobalResourceObject()返回null

上面代码中的问题是,尽管您正在设置HttpContextBase,但它与您的代码无关。因此,当在Translate方法中进行实际调用时,HttpContext不是您嘲笑的,因此总是返回null。

由于它是一个独立的类,因此设置HttpContext很困难。如果该代码是从控制器调用的,则可以写入

controller.ControllerContext = myMockedContext; 

要解决这个问题,您可以使用Joe先生在回答中提供的解决方案,您可以像这样更改您的静态助手类方法,注入HttpContextBase对象:

    public static HtmlString Translate(this HtmlHelper htmlhelper, HttpContextBase contextBase, string defaultString, string key, params object[] objects)
    {
        var resource = contextBase.GetGlobalResourceObject(null, key);
        if (resource != null)
        {
            defaultString = resource.ToString();
        }
        return objects.Length > 0 ? new HtmlString(string.Format(defaultString, objects)) : new HtmlString(defaultString);
    }

从你的测试中,你可以通过模拟的contextBase对象,如下所示:

[TestMethod]
public void HtmlHelperExtentions_Translate_WithValidInputs_ReturnsTranslatedContent()
{
    // Arrange          
    var defaultstring = "TestMessage";
    var inputkey = "XX.Areas.Onboarding.{0}Messages.Message_Onboarding_XX_1001";
    var expectedvalue = "HolaMessage";
    HtmlHelper htmlhelper = null;
    contextBase.Setup(ctx => ctx.GetGlobalResourceObject(null, inputkey)).Returns(expectedvalue);
    //Act
    var result = HtmlHelperExtentions.Translate(htmlhelper, contextBase.Object, defaultstring, inputkey);
    //Assert            
    Assert.IsNotNull(result);
    Assert.AreEqual(expectedvalue, result.ToString());
}