Dam*_*ien 1 asp.net-mvc unit-testing rhino-mocks
我试图模拟ASP.Net MVC的Ajax.IsRequest()方法.我发现了如何做以使它返回true:
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any();
Run Code Online (Sandbox Code Playgroud)
这工作并返回true.现在我需要测试代码的另一个分支.我如何模仿它返回虚假?我试图完全删除模拟,它失败了:
System.NullReferenceException:对象引用未设置为对象的实例.]
如果我做:
Expect.Call(_templateReportController.Request["X-Requested-With"]).Return(null).Repeat.Any();
Run Code Online (Sandbox Code Playgroud)
它失败并出现同样的错误.
整个测试:
/// <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);
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?干杯
你得到的原因NullReferenceException是因为你从未controller.Request在单元测试中存根该对象,并且当你调用使用Request.IsAjaxRequest()它的控制器动作时抛出.
以下是使用Rhino.Mocks以下方法模拟上下文的方法:
[TestMethod]
public void Test_Ajax()
{
// arrange
var sut = new HomeController();
var context = MockRepository.GenerateStub<HttpContextBase>();
var request = MockRepository.GenerateStub<HttpRequestBase>();
context.Stub(x => x.Request).Return(request);
// indicate AJAX request
request.Stub(x => x["X-Requested-With"]).Return("XMLHttpRequest");
sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
// act
var actual = sut.Index();
// assert
// TODO: ...
}
[TestMethod]
public void Test_Non_Ajax()
{
// arrange
var sut = new HomeController();
var context = MockRepository.GenerateStub<HttpContextBase>();
var request = MockRepository.GenerateStub<HttpRequestBase>();
context.Stub(x => x.Request).Return(request);
sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
// act
var actual = sut.Index();
// assert
// TODO: ...
}
Run Code Online (Sandbox Code Playgroud)
这里有一个更好的选择(我个人推荐你),以避免所有的管道代码.使用 MVCContrib.TestHelper(基于Rhino.Mocks),您的单元测试可能会简化为:
[TestClass]
public class HomeControllerTests : TestControllerBuilder
{
private HomeController _sut;
[TestInitialize()]
public void MyTestInitialize()
{
_sut = new HomeController();
this.InitializeController(_sut);
}
[TestMethod]
public void HomeController_Index_Ajax()
{
// arrange
_sut.Request.Stub(x => x["X-Requested-With"]).Return("XMLHttpRequest");
// act
var actual = _sut.Index();
// assert
// TODO: ...
}
[TestMethod]
public void HomeController_Index_Non_Ajax()
{
// act
var actual = _sut.Index();
// assert
// TODO: ...
}
}
Run Code Online (Sandbox Code Playgroud)
更漂亮.它还允许您在动作结果上写出更具表现力的断言.查看文档或询问是否需要更多信息.
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |