1

我有以下代码。我有一些合理的理由对该属性进行两次存根(参见下面的解释)。看起来它只让我存根一次。

private IStatus _status;

[SetUp()]
public void Setup() {
  this._status = MockRepository.GenerateStub<IStatus>();
  this._status.Stub(x => x.Connected()).Return(true);
  // This next line would usually be in the Setup for a subclass
  this._status.Stub(x => x.Connected()).Return(false);
}

[Test()]
public void TestTheTestFramework() {
  Assert.IsFalse(this._status.Connected()); // Fails...
}

public interface IStatus {
  bool Connected { get; }
}

我尝试下载最新版本(3.6 build 21),但仍然有同样的问题。关于为什么我不能这样做的任何想法?我尝试将Connected属性更改IStatus为函数,但测试仍然失败。我在 VB.Net 中得到相同的行为......错误?

双截断的解释

我正在围绕继承构建我的测试。这样我就可以只做一次通用设置代码,使用注入的模拟依赖项来模拟不同的条件。我可能会提供一个基本/默认存根值(例如,是的,我们已连接),我想在子类中覆盖它,以在连接断开时测试 SUT 的行为。我通常会得到这样的代码。

[TestFixture()]
public class WhenPublishingAMessage {

  // Common setup, inject SUT with mocked dependencies, etc...

  [Test()]
  public void ShouldAlwaysWriteLogMessage {
    //Example of test that would pass for any sub-condition
  }

  [TestFixture()]
  public class AndNoConnection : WhenPublishingAMessage {
    // Do any additional setup, stub dependencies to simulate no connection
    // Run tests for this condition
  }

  [TestFixture()]
  public class AndHaveConnection : WhenPublishingAMessage {
    // Do any additional setup and run tests for this condition
  }
}

编辑

Rhino Mocks google group 上的这篇文章可能会有所帮助。看起来我可能需要打电话this._status.BackToRecord();来重置状态,可以这么说......另外,.Repeat.Any()加入第二个存根语句似乎也有帮助。稍后我将不得不发布更多详细信息。

4

2 回答 2

2

您可以在第一个结果上指定 .Repeat.Once() ,以便将其使用一次,然后再使用下一个,如其他堆栈溢出问题中所述

于 2012-09-24T20:49:14.073 回答
0

总而言之,可能有三个不同的答案:

塔尔马里斯的回答:

.Repeat.Times(n)使用、.Repeat.Once()、等指定在第一个存根上返回的特定次数.Repeat.Twice()。例如:

this._status.Stub(x => x.Connected()).Return(true).Repeat.Once(); this._status.Stub(x => x.Connected()).Return(false);

如果我知道在我改变它的行为之前存根将被调用的次数(例如,它只在构造函数中被调用一次),这个方法就会很好地工作。

重置模拟对象

我不喜欢这种方法,因为我想避免(至少对我而言)更麻烦的 Expect/Verify Record/Replay 类型语法。它是为了回应我在 Rhino Mocks Google 小组中与此问题同名的帖子而向我推荐的。

this._status.Stub(x => x.Connected).Return(true);

this._status.GetMockRepository().BackToRecordAll();
this._status.GetMockRepository().ReplayAll();

this._status.Stub(x => x.Connected).Return(false);

使用神奇的 Repeat.Any

我发现.Repeat.Any()在第二个存根上使用会覆盖第一个存根......我感觉有点糟糕添加一些额外的“魔术”代码以使其工作,但在你不知道多久告诉第一个存根的情况下要返回,此选项将起作用。

this._status.Stub(x => x.Connected()).Return(true);
this._status.Stub(x => x.Connected()).Return(false).Repeat.Any();

注意:你不能做.Repeat.Any()超过一次。

于 2012-11-01T16:57:37.863 回答