【问题标题】:ArgumentNullException with RhinoMocks 3.6ArgumentNullException 与 RhinoMocks 3.6
【发布时间】:2010-07-21 18:56:46
【问题描述】:

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。值不能为空。 参数名称:来源。

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

非常感谢!

【问题讨论】:

  • 你不应该做类似 fakeItems = GetFakeActionItems(); ... Stub(...).Return(fakeItems)?
  • 技术上?当然。但这对使用相同 ArgumentNullException 的测试方法没有影响。 :(
  • 在 MockRepository.GenerateMock(null) 中传递 null 是否有原因?
  • 是我在发布之前未能删除的问题。无论有没有我都使用相同的 ArgumentNullException。让我从帖子中删除它。
  • 这里可能是一个愚蠢的角度,但你能告诉我们GetFakeActionItems吗?

标签: c# rhino-mocks


【解决方案1】:

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

因此,当您的模拟 ActionItemRepository 运行已存根的 Select() 时,它会返回 null(通过 GetFakeActionItems),这会导致后续的 ToList&lt;Model.ActionItem&gt;()ArgumentNullException 一起燃烧。

您在GetFakeActionItems 中真正想做的是:

myList.AsQueryable()

【讨论】:

  • 是的。这就是问题所在……非常感谢 Adrew。进行更改使测试按预期通过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多