2010-07-21 36 views
2

鴨舌試圖測試,它返回使用RhinoMocks 3.6ArgumentNullException與RhinoMocks 3.6

[TestMethod] 
    public void GetItems_Returns_ActionItemsList() 
    { 
     // arrange 
     var mockRepository = MockRepository.GenerateMock<IActionItemRepository>(); 
     mockRepository.Stub(s => s.Select()).Return(GetFakeActionItems()); 

     var service = new ActionItemQueueService(mockRepository); 

     // act 
     var actual = service.GetItems(); 

     mockRepository.VerifyAllExpectations(); 

     // assert 
     Assert.IsInstanceOfType(actual, typeof(IList<ActionItem>)); 
    } 

房地產simplle右一個簡單的IList服務層的方法? GetFakeActionItems方法供參考;

internal IQueryable<ActionItem> GetFakeActionItems() 
    { 
     return new List<ActionItem> {    
             new ActionItem{ 
              Id = 5, 
              ClientName = "Bank of American Corporation", 
              ActionNeeded = RequiredAction.Change, 
              RecordIndicator = "ROI", 
              RequestDate = DateTime.Now.AddDays(-3) 
             } 
     } as IQueryable<ActionItem>; 
    } 

下面是測試中的類和方法...

public class ActionItemQueueService : IActionQueueService 
{ 
    private readonly IActionItemRepository _actionItemRepository; 

    public ActionItemQueueService(IActionItemRepository actionItemRepository) 
    { 
     _actionItemRepository = actionItemRepository; 
     if (_actionItemRepository == null) 
     { 
      throw new ArgumentNullException("ActionItemRepository"); 
     } 
    } 




    public IList<Model.ActionItem> GetItems() 
    { 
     return _actionItemRepository.Select().ToList<Model.ActionItem>(); 
    } 
} 

沒有什麼野生.... 當我運行我的測試,我得到一個ArgumentNullException當GetItems()方法被調用當_actionItemRepository.Select()觸發。值不能爲空。 參數名稱:來源。

困惑和困惑,想知道如果有人有任何洞察到我失蹤。

非常感謝!

+0

你不是應該做一些像 fakeItems = GetFakeActionItems(); ...存根(...)。返回(fakeItems)?技術上是 – Mathias 2010-07-21 19:03:08

+0

?當然。但是,對於使用相同的ArgumentNullException爆炸的測試方法並沒有什麼不同。 :( – 2010-07-21 19:08:46

+0

是否有一個原因,你爲什麼傳遞null在MockRepository.GenerateMock (null)? – Mathias 2010-07-21 19:09:22

回答

3

我認爲問題在於你正在考慮你的List<ActionItem>並在你的GetFakeActionItems方法中對它執行「as IQueryable<ActionItem>」。這將返回null,因爲它不是有效的轉換。

因此,當你的模擬運行ActionItemRepository的掐滅Select()返回null(通過GetFakeActionItems),這將導致後續ToList<Model.ActionItem>()下井在火焰與ArgumentNullException

你真的想在你的GetFakeActionItems做的是:

myList.AsQueryable() 
+0

是的,這是問題...非常感謝Adrew。更改允許測試按預期通過。 – 2010-07-21 20:50:51