我正在使用Moq模拟一个HttpRequest对象,用于ASP.NET MVC中的单元测试。我需要在请求中设置一个ServerVariables(LOGON_USER)。这可能吗?我尝试使用以下方法,但我得到一个例外,因为ServerVariables集合是不可覆盖的。
request.SetupGet(req => req.ServerVariables["LOGON_USER"]).Returns(@"TestUserName");
是否可以设置ServerVariable值进行测试?
我是否需要传入新的NameValueCollection而不是尝试设置一个特定的密钥?
答案 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));