2010-07-21 51 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