【问题标题】:How to test using interface collection with Rhino.Mocks如何使用 Rhino.Mocks 使用接口集合进行测试
【发布时间】:2013-01-09 18:10:16
【问题描述】:

在我的界面中

public IMyListInterface : IList<IMyItem> { void Foo(); }

如何轻松创建一个示例来测试使用 IMyListInterface 的类。

目前我正在使用 GenerateStub&lt;MyListInterface&gt;() 并将所需的方法/属性委托给 List&lt;IMyItem&gt; 列表,但这很乏味。

目前正在测试以下代码工作

foreach (var match in matchList)

我在我的测试课中做以下事情

IList<IMyItem> baseList = new List<IMyItem>();
IMyListInterface matchList = MockRepository.GenerateStub<IMyListInterface>();

matchList.Stub(m => m.GetEnumerator()).Return(null).WhenCalled(i => i.ReturnValue = baseList.GetEnumerator());

有没有更好的办法?

【问题讨论】:

  • 为什么不直接使用 Rhino.Mocks 内置的“Stub”方法——即 myListStub.Stub(f => f.Foo()) ?您能否展示一些您当前如何使用 Rhino.Mocks 的代码?
  • Foo 的存根工作正常,但模拟列表行为很乏味,因为我必须存根 Add、RemoveAt、Count 等。我想知道是否有办法让 Rhino Mocks 让我知道它直接使用列表。
  • 让我们退后一步。为什么要模拟列表?通常(并非总是),模拟用于存根整个依赖项。您是否希望删除列表的某些行为——但保持其余功能相同?更多信息会有所帮助。
  • 我不想模拟列表。但是我想测试的项目表现出列表行为。理想情况下,我只想有一个列表(例如 new List()),但看不到如何获得它。我的类中有一个名为 MatchList 的变量,正在测试 IMyListInterface 类型,我需要从该变量中获取列表行为。我尝试将 List 强制转换为 IMyListInterface 但这引发了异常。
  • 你为什么还要存根 IMyListInterface 实现?如果它只有列表行为(添加/删除),只需使用具体的实现 - 无需将其存根(据我所知 - 您仍然没有提供代码来显示您正在尝试的内容测试)。

标签: list rhino-mocks stub


【解决方案1】:

在抽象基类中实现接口以进行测试:

public abstract MyMockableList : List<MyItem>, IMyListInterface
{
    public abstract void Foo();
}

然后您可以使用MockRepository.GenerateStub&lt;MyMockableList&gt;(),它将用作普通列表(RhinoMocks 不会覆盖从List&lt;MyItem&gt; 继承的方法),但您仍然可以存根Foo() 方法。

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2022-12-15
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多