使用Moq模拟MVC WebViewPage

时间:2014-04-10 09:43:50

标签: unit-testing moq

我想模拟一个WebViewPage并将输出与预期结果进行比较。

这是我使用

的嘲笑者
public static class MockHelpers
{
    public static HttpContextBase MockHttpContext(NameValueCollection queryStringCollection = null)
    {

        var request = new Mock<HttpRequestBase>(MockBehavior.Strict);

        if(queryStringCollection != null)
        SetupMockRequestQuerystringValues(request, queryStringCollection);

        request.SetupGet(x => x.ApplicationPath).Returns("/");
        request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute));
        request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection());

        var response = new Mock<HttpResponseBase>(MockBehavior.Strict);
        response.Setup(x => x.ApplyAppPathModifier(Moq.It.IsAny<String>())).Returns((String url) => url);
        // response.SetupGet(x => x.Cookies).Returns(new HttpCookieCollection()); // This also failed to work

        var context = new Mock<HttpContextBase>(MockBehavior.Strict);
        context.SetupGet(x => x.Request).Returns(request.Object);
        context.SetupGet(x => x.Response).Returns(response.Object);
        context.SetupGet(x => x.Response.Cookies).Returns(new HttpCookieCollection()); // still can't call the Clear() method
        context.SetupGet(p => p.User.Identity.Name).Returns("blah");
        context.SetupGet(p => p.User.Identity.IsAuthenticated).Returns(true);

        return context.Object;
    }

    private static void SetupMockRequestQuerystringValues( Mock<HttpRequestBase> request, NameValueCollection queryStringCollection)
    {
        request.SetupGet(x => x.QueryString).Returns(queryStringCollection);
    }


    public static ViewContext MockViewContext()
    {
        return CreateSimpleGenericMock<ViewContext>();
    }


    public static T MockWebViewPage<T>() where T : WebViewPage
    {
        var mock = new Mock<T>(MockBehavior.Loose) { CallBase = true };
        mock.SetupGet(x => x.Context).Returns(MockHttpContext());
        mock.SetupGet(x => x.Layout).Returns("layoutName");
        mock.SetupGet(x => x.VirtualPath).Returns("virtualPathName");
        mock.SetupGet(x => x.Page).Returns(new object{});
        mock.SetupGet(x => x.PageData).Returns(new Dictionary<object, dynamic>()
        {
            {new object(), new object()}
        });

        var page = mock.Object;
        //var helper = new HtmlHelper<object>(new ViewContext { ViewData = CreateSimpleGenericMock<ViewDataDictionary>() }, page, CreateSimpleGenericMock<RouteCollection>());
        var helper = new HtmlHelper<object>(new ViewContext { ViewData = new ViewDataDictionary() }, page, new RouteCollection());
        page.ViewContext = MockViewContext();
        page.Html = helper;

        return page;
    }


    public static T CreateSimpleGenericMock<T>() where T : class
    {
        var mock = new Mock<T>();

        return mock.Object;
    }
}

在MockWebViewPage方法中,您可以看到我伪造的所有内容。我的测试方法看起来像这样

 [TestMethod]
    public void TestMethod1()
    {
        var coreMasterTestClass = MockHelpers.MockWebViewPage<CoreMaster<object>>();

        coreMasterTestClass.ExecutePageHierarchy();

        var output = coreMasterTestClass.Html;
    }

是否可以测试将通过模拟生成的输出,如果没有,是否有任何可能的线索我如何测试它。请注意,我没有测试实际的chstml页面,而是在我们自己的框架中测试核心页面。

0 个答案:

没有答案