1

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

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

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

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

4

3 回答 3

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...
于 2009-09-15T12:45:11.280 回答
0

好的,想通了这一点。我创建了这个方法来为 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));
于 2009-07-20T13:45:10.790 回答
0

对的,这是可能的:

于 2009-07-20T12:04:51.627 回答