2010-06-18 72 views
1

我想模擬ASP.Net MVC的Ajax.IsRequest()方法。我發現如何做到這一點,以便它返回true:嘲笑Ajax.IsRequest返回False

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); 
     } 


    } 

有何意見? 乾杯

+0

請參閱:http://stackoverflow.com/questions/2929058/newbie-question-on-mvccontrib-testhelpers – PatrickSteele 2010-06-18 11:34:08

+0

正如我所說,我可以得到它來嘲笑它返回true,這個問題的代碼示例所做的,但我似乎無法讓它返回false。 – Damien 2010-06-18 13:22:26

+0

你可以粘貼整個測試嗎? – Grzenio 2010-06-21 12:21:05

回答

7

你得到的原因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: ... 
} 

這裏是一個更好的選擇(我個人建議你),以避免所有的管道代碼。使用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: ... 
    } 
} 

漂亮得多。它還允許你在動作結果上寫更多的表達性斷言。檢出文檔或詢問是否需要更多信息。

+0

乾杯。要試試這個(和那個框架,似乎它會讓我的生活更輕鬆,很快就會發表評論,直到再次感謝! – Damien 2010-06-22 20:20:05

1
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("SpitAndDuctTape").Repeat.Any(); 

...應該做的工作。

+0

因Request.Headers爲空而失敗。可能還需要嘲笑這一點。 – Damien 2010-06-18 15:34:44

+0

你完全可以這麼做,就像你爲「true」情況做的那樣,但只是改變這一行。其實,就是這一串。如果您提供的代碼適用於「真實」,則您聲明的代碼必須存在您未展示的其他代碼。對這種情況使用相同的代碼。 – 2010-06-18 15:54:39