使用RhinoMocks 3.6的ArgumentNullException

时间:2010-07-21 18:56:47

标签: c# rhino-mocks

Benn尝试使用RhinoMocks 3.6

测试一个返回简单IList的服务层方法
[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>));
    }

真正的简单吧? 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>();
    }
}

没什么野性.... 当我运行我的测试时,当_actionItemRepository.Select()触发时调用GetItems()方法时,我得到一个ArgumentNullException。值不能为空。 参数名称:source。

困惑和困惑,想知道是否有人对我所缺少的东西有任何见解。

非常感谢!

1 个答案:

答案 0 :(得分:3)

我认为问题在于您正在List<ActionItem>方法中使用as IQueryable<ActionItem>并执行“GetFakeActionItems”。这将返回null,因为它不是有效的转换。

因此,当你的模拟ActionItemRepository运行存根Select()时,它会返回null(通过GetFakeActionItems),这会导致随后的ToList<Model.ActionItem>()在火焰中熄灭ArgumentNullException

您在GetFakeActionItems中实际想要做的是:

myList.AsQueryable()