【问题标题】:Set a ServerVariable value when mocking HttpRequest using Moq?使用 Moq 模拟 HttpRequest 时设置 ServerVariable 值?
【发布时间】:2009-07-20 11:54:31
【问题描述】:

我正在使用 Moq 模拟 HttpRequest 对象,以便在 ASP.NET MVC 中进行单元测试。我需要在请求中设置一个 ServerVariables (LOGON_USER)。这可能吗?我曾尝试使用以下方法,但由于 ServerVariables 集合不可覆盖,因此出现异常。

    request.SetupGet(req => req.ServerVariables["LOGON_USER"]).Returns(@"TestUserName");

是否可以设置一个 ServerVariable 值进行测试?

我是否需要传入一个新的 NameValueCollection 而不是尝试设置一个特定的键?

【问题讨论】:

标签: asp.net-mvc unit-testing mocking moq


【解决方案1】:

这是一种方法。我通常通过更改规则来嘲笑这些事情:我不想在我的测试中了解HttpRequest 或其亲属。相反,我问:如果我要决定,我在哪里可以获得登录用户的名称?

那就是ICallerContext 或者我们能想出的任何更好的名字。然后我改为模拟这个界面。

我的控制器需要一个对新依赖项的引用:

public class MyController
{
  public MyController(ICallerContext caller) {...}
}

我的测试需要将模拟实例传递给控制器​​:

var caller = new Mock<ICallerContext>();
var controller = new MyController(caller.Object);

caller.Setup(c => c.LogonUserName).Returns("TestUserName");

controller.DoTheMagic();

//Assertion(s) goes here...

【讨论】:

    【解决方案2】:
    【解决方案3】:

    好的,解决了这个问题。我创建了这个方法来为 ServerVariables 创建 NameValueCollection:

    private static NameValueCollection CreateServerVariables(string logonUserName)
    {
        var collection = new NameValueCollection {{"LOGON_USER", logonUserName}};
        return collection;
    }
    

    然后我在我的配置中这样称呼它:

        var request = new Mock<HttpRequestBase>();
    
        request.SetupGet(req => req.ServerVariables).Returns(CreateServerVariables(userName));
    

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多