模拟 Ajax.IsRequest 返回 False
我试图模拟 ASP.Net MVC 的 Ajax.IsRequest() 方法。我找到了如何执行它才能返回 true:
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any();
这有效并返回 true。现在我需要测试代码的另一个分支。我怎样才能模拟它返回 false?我尝试完全删除模拟,但失败了:
System.NullReferenceException:对象 未设置对实例的引用 对象。]
如果我这样做:
Expect.Call(_templateReportController.Request["X-Requested-With"]).Return(null).Repeat.Any();
它会失败并出现相同的错误。
整个测试:
/// <summary>
/// Tests the Edit Action when calling via Ajax
/// </summary>
[Test]
public void Test_Edit_AjaxRequest()
{
Group group = new Group();
group.ID = 1;
group.Name = "Admin";
IList<Group> groupList = new List<Group>() { group };
Definition def = new Definition();
def.ID = 1;
def.Name = "Report";
def.LastModified = DateTime.UtcNow;
def.Groups.Add(group);
using (_mocks.Record())
{
Expect.Call(_myController.Request["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any();
Expect.Call(_DefBiz.GetAll<Group>()).Return(groupList);
Expect.Call(_DefBiz.Get<Definition>(1)).Return(def);
}
myController.DefAccess = _DefBiz;
PartialViewResult actual;
using (_mocks.Playback())
{
actual = (PartialViewResult)myController.Edit(1);
}
}
有什么建议吗? 干杯
I am trying to mock the Ajax.IsRequest() method of ASP.Net MVC. I found out how to do it in order for it to return true:
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any();
This works and returns true. Now I need to test the other branch of the code. How can I mock it to return false? I have tried removing the mock altogether, It fails with:
System.NullReferenceException : Object
reference not set to an instance of an
object.]
If I do:
Expect.Call(_templateReportController.Request["X-Requested-With"]).Return(null).Repeat.Any();
It fails with the same error.
Entire Test:
/// <summary>
/// Tests the Edit Action when calling via Ajax
/// </summary>
[Test]
public void Test_Edit_AjaxRequest()
{
Group group = new Group();
group.ID = 1;
group.Name = "Admin";
IList<Group> groupList = new List<Group>() { group };
Definition def = new Definition();
def.ID = 1;
def.Name = "Report";
def.LastModified = DateTime.UtcNow;
def.Groups.Add(group);
using (_mocks.Record())
{
Expect.Call(_myController.Request["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any();
Expect.Call(_DefBiz.GetAll<Group>()).Return(groupList);
Expect.Call(_DefBiz.Get<Definition>(1)).Return(def);
}
myController.DefAccess = _DefBiz;
PartialViewResult actual;
using (_mocks.Playback())
{
actual = (PartialViewResult)myController.Edit(1);
}
}
Any advices?
Cheers
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您收到
NullReferenceException
的原因是因为您从未在单元测试中以及调用使用Request.IsAjaxRequest( 的控制器操作时存根
它抛出。controller.Request
对象) )以下是使用
Rhino.Mocks
模拟上下文的方法:这里有一个更好的替代方案(我个人推荐您),以避免所有的管道代码。使用 MVCContrib.TestHelper (基于
Rhino.Mocks
)您的单元测试可能会简化为:更漂亮。它还允许您对操作结果编写更具表现力的断言。查看文档或询问是否需要更多信息。
The reason your are getting
NullReferenceException
is because you never stubbed thecontroller.Request
object in your unit test and when you invoke the controller action which usesRequest.IsAjaxRequest()
it throws.Here's how you could mock the context using
Rhino.Mocks
:And here's a better alternative (which I would personally recommend you) in order to avoid all the plumbing code. Using MVCContrib.TestHelper (which is based on
Rhino.Mocks
) your unit test might be simplified to this:Much prettier. It also allows you to write much more expressive asserts on the action results. Checkout the doc or ask if for more info is needed.
...应该完成这项工作。
...should do the job.