如何清除以前的对象的期望?

我想设置一个返回值

_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(true); 

但是在特定的testing中,重写该期望返回false。

就像是:

 _stubRepository.ClearExpectations(); //<- this does not exist, I'm just making something up _stubRepository.Stub(Contains(null)).IgnoreArguments().Return(false); 

注意,我不希望在第二次调用时返回false,我想覆盖第一个期望值。

这将有助于大大简化我的testing场景。

有三种方法:

您可以使用BackToRecord重置期望值

我不得不承认,我从来没有真正使用它,因为它是尴尬的。

 // clear expectations, an enum defines which _stubRepository.BackToRecord(BackToRecordOptions.All); // go to replay again. _stubRepository.Replay(); 

编辑:现在我有时使用它,它实际上是最干净的方式。 应该有一个扩展方法(如存根),这是它 – 我认为它只是被遗忘。 我会build议写你自己的。

你可以使用Repeat.Any()

它“打破”残留定义的顺序,并“覆盖”以前的定义。 但它有点隐含。 我有时使用它,因为它很容易写。

 _stubRepository.Stub(x => x.Contains(null)) .IgnoreArguments() .Return(false) .Repeat.Any(); 

你可以创build一个新的模拟

琐碎,但明确,容易理解。 如果你想保留大量的定义,只改变一个呼叫,这只是一个问题。

 _stubRepository = MockRepository.GenerateMock<IRepository>(); _stubRepository.Stub(x => x.Contains(null)) .IgnoreArguments() .Return(false); 

针对这些情况,我创build了一个简单的RinoMocks扩展方法,以更好地显示存根的意图并提高可读性。

 public static void OverridePrevious<T>(this IMethodOptions<T> options) { options.Repeat.Any(); } 

所以,而不是像以下可能需要一个评论神秘的呼吁:

 [SetUp] public void Setup() { carStub.Stub(x => x.Model).Return("Model1"); carStub.Stub(x => x.Model).Return("Model2"); } [Test] public void SomeTest() { //Arrange //overrides previous stubs that were setup for the Model property carStub.Stub(x => x.Model).Return(null).Repeat.Any(); //Act //Assert } 

你可以得到一个更可读的testing,更好地显示.Repeat.Any()调用的意图:

 carStub.Stub(x => x.Model).Return(null).OverridePrevious(); 

为了社区的缘故,我将添加这个以添加到Stefan上面的选项列表中:

如果返回值需要经常更改,我发现它使用一个闭包干净和高效,如下所示。

 bool returnValue = true; _stubRepository.Stub(x => x.Contains(null)).IgnoreArguments().Do(new Func<bool>(() => { return returnValue; })); returnValue = false; // Calls to Contains now return false; returnValue = true; // Calls to Contains now return true; 

lambdaexpression式将在每次调用Contains执行,因为我们创build了一个闭包引用returnValue ,它总是会查找当前returnValue