使用Moq模拟Http请求时设置服务器变量值?

时间:2009-07-20 11:54:32

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

我正在使用Moq模拟一个HttpRequest对象,用于ASP.NET MVC中的单元测试。我需要在请求中设置一个ServerVariables(LOGON_USER)。这可能吗?我尝试使用以下方法,但我得到一个例外,因为ServerVariables集合是不可覆盖的。

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

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

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

3 个答案:

答案 0 :(得分: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...

答案 1 :(得分:0)

答案 2 :(得分: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));