我可以让Rhino Mocks GenerateStub或GenerateMock每次都返回一个新类型吗?

时间:2010-10-07 12:59:39

标签: rhino-mocks

我想创建一个包含所有不同具体类型的对象的IList,所以:

var tasks = new List<ITask>();
foreach (string taskName in taskNames)
{
    var task = MockRepository.GenerateStub<ITask>();
    task.Stub(t => t.Name).Return(taskName);
    tasks.Add(task);
}
return tasks;

问题是每个存根对象都是相同的具体类型。通常这很好,但我有一个案例,我想测试每个是不同的类型。在这种情况下,我可以以某种方式配置Rhino Mocks来执行此操作吗?

修改

今天,“你必须做错的船员”已经生效。既然你们似乎认为我需要证明我的用例是合理的,那么你可以先回答我的问题,这就是我正在做的事情:

  • ITask在我的域模型中,因此它是我业务层的一部分。
  • 我在更高级别(表示)层中有逻辑,它将ITask作为参数。
  • 表示层逻辑通常在ITask上执行默认策略,但是可能存在需要使用不同策略的特殊情况,并且要使用的策略完全取决于ITask对象的具体类型。
  • 常规策略模式在这里不起作用,因为这需要我的具体ITask对象知道它们上面的层。
  • 装饰者仍然必须知道他们装饰的物体的具体类型,并且必须在施工时应用(对于这种情况来说是错误的层)或者在使用时,但是这会让我遇到同样的问题 - 应用基于具体类型的装饰器。
  • 我决定使用WPF中DataTemplates(和DataType属性)使用的相同模式。也就是说,给定来自较低层的对象,看看是否有人注册了一个策略来处理该类型,如果是,请使用它。否则,请使用默认策略。

所以,我希望你能明白为什么我需要测试逻辑。到目前为止,我不得不编写自己的Stub工厂,该工厂由有限的ITask类型池产生。它有效,但我宁愿让Rhino Mocks为我做这件事。

1 个答案:

答案 0 :(得分:3)

您可以添加ITask.Type属性。

对接口背后的类型感兴趣的代码应该使用此属性而不是调用GetType()。在您的测试中,控制Type属性为任何给定的ITask存根返回的内容变得微不足道。