asp.net-mvc - 如何使用 ASP.NET MVC 的最小起订量模拟 Request.ServerVariables?

标签 asp.net-mvc unit-testing moq

当我开始了解模拟和现在存在的不同框架时,我刚刚学习为我的 ASP.NET MVC 进行单元测试。

检查后,我发现最小起订量似乎是最容易接受的。 截至目前,我一直在尝试模拟 Request.ServerVariables,如 after reading this post ,我了解到最好将它们抽象为属性。

因此:

/// <summary>
        /// Return the server port
        /// </summary>
        protected string ServerPort
        {
            get
            {
                return Request.ServerVariables.Get("SERVER_PORT");
            }
        }

但是我很难学习如何正确地 mock 这个。 我有一个家庭 Controller ActionResult 函数,它获取用户服务器信息并继续创建一个表单来获取用户信息。

我尝试使用hanselman's mvcmockhelpers class但我不知道如何使用它。

这就是我到目前为止所拥有的......

[Test]
        public void Create_Redirects_To_ProductAdded_On_Success() 
        {

            FakeViewEngine engine = new FakeViewEngine();

            HomeController controller = new HomeController();
            controller.ViewEngine = engine;

            MvcMockHelpers.SetFakeControllerContext(controller);

            controller.Create();

            var results = controller.Create();

            var typedResults = results as RedirectToRouteResult;

            Assert.AreEqual("", typedResults.RouteValues["action"], "Wrong action");
            Assert.AreEqual("", typedResults.RouteValues["controller"], "Wrong controller");
        }

问题:

  1. 到目前为止我仍然处于空状态 当我运行时出现异常错误 测试。那么我在这里缺少什么?
  2. 如果我使用 mvcmockhelpers 类,我怎么还能打电话 request.verifyall函数来确保 所有的模拟都正确设置了吗?

最佳答案

所以基本上我已经输入了所有引用文献并使用这个函数我能够让它工作。我还没有使用 mvcmockhelpers 类,因为我仍在尝试学习所有这些。

对于任何有兴趣了解我如何解决这个问题的人,这是我使用的代码。

[Test]
public void Create_Returns_ViewResult_On_Success() 
{
  var server = new Mock<HttpServerUtilityBase>(MockBehavior.Loose);
  var response = new Mock<HttpResponseBase>(MockBehavior.Strict);

  var request = new Mock<HttpRequestBase>(MockBehavior.Strict);
  request.Setup(x => x.ApplicationPath).Returns("/");
  request.Setup(x => x.Url).Returns(new Uri("http://localhost"));
  request.Setup(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection{
    { "SERVER_NAME", "localhost" },
    { "SCRIPT_NAME", "localhost" },
    { "SERVER_PORT", "80" },
    { "HTTPS", "www.melaos.com" },
    { "REMOTE_ADDR", "127.0.0.1" },
    { "REMOTE_HOST", "127.0.0.1" }
  });

  var context = new Mock<HttpContextBase>();
  context.SetupGet(x => x.Request).Returns(request.Object);
  context.SetupGet(x => x.Response).Returns(response.Object);
  context.SetupGet(x => x.Server).Returns(server.Object);

  var controller = new HomeController();
  //MvcMockHelpers.SetFakeControllerContext(controller);
  controller.ControllerContext = new ControllerContext(context. Object, new RouteData(), controller);

  var results = controller.Create();
  Assert.IsNotNull(results);
  Assert.IsInstanceOf(typeof(ViewResult), results);
}

关于asp.net-mvc - 如何使用 ASP.NET MVC 的最小起订量模拟 Request.ServerVariables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770265/

相关文章:

c# - 使用 JsonResult 显示验证消息

c# - MVC 中通过 Ajax 发送多个数组

c# - 暂时将 visual studio 中的数据库连接从服务器数据库更改为本地数据库

c# - 如何使用 AutoMapper 模拟列表转换

c# - Moq 设置 当模拟实现具有相同方法签名的多个接口(interface)的接口(interface)时出现 InvalidCastException

c# - 更新 ASP.NET One Core 中的声明值

java - 如何为 ProcessBuilder 编写测试用例

java - Spring 启动: how to run a test class only on jenkins?

node.js - Nodejs 单元测试失败时的电子邮件通知

c# - 使用 Moq 模拟 HttpClient