【问题标题】:Rhino Mocks : How to change expectation on method, property or field without clear all expectation?Rhino Mocks:如何在没有明确所有期望的情况下改变对方法、属性或字段的期望?
【发布时间】:2013-08-14 02:38:08
【问题描述】:

我使用 Rhino Mocks 3.6 版,而我找到的答案 here 在我的情况下不起作用:

    [TestMethod()]
    public void Test()
    {
        IConnected connectable = MockRepository.GenerateStub<IConnected>();
        connectable.Stub(c => c.Connect()).Do(new Action(() =>
        {
            bool test = false;
            if (!test)
                test = true;
        })).Repeat.Any();
        connectable.Stub(c => c.Connect()).Do(new Action(() => { })).Repeat.Any();
    }

我有一个 InvalidOperationException: The result for IConnected.Connect();已经设置好了。

我用 stub 和 mock 测试它,我得到了相同的结果。

我用属性做了同样的测试,它也不起作用。

    [TestMethod()]
    public void Test()
    {
        IConnected connectable = MockRepository.GenerateStub<IConnected>();
        connectable.Stub(c => c.IsConnected).Return(true).Repeat.Any();
        connectable.Stub(c => c.IsConnected).Return(false).Repeat.Any();
    }

是 Rhino Mocks 的坏版本还是有回归?

唯一可行的方法是清除所有期望,但我必须将所有平均期望重置为相同的值:

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

我的 IConnected 界面:

/// <summary>
/// Represents connected component management interface.
/// </summary>
public interface IConnected
{
    /// <summary>
    /// Gets the connection status.
    /// </summary>
    ConnectionState ConnectionStatus { get; }
    /// <summary>
    /// Gets a value indicating whether this instance is connected.
    /// </summary>
    /// <value>
    ///     <c>true</c> if this instance is connected; otherwise, <c>false</c>.
    /// </value>
    bool IsConnected { get; }
    /// <summary>
    /// Occurs when [connection state changed].
    /// </summary>
    event EventHandler<ConnectionStateChangeEventArgs> ConnectionStateChanged;
    /// <summary>
    /// Connects this instance.
    /// </summary>
    void Connect();
    /// <summary>
    /// Disconnects this instance.
    /// </summary>
    void Disconnect();
    /// <summary>
    /// Occurs when [reconnect].
    /// </summary>
    event EventHandler<ConnectionRetryEventArgs> RetryConnection;
}

【问题讨论】:

  • 你需要改变什么期望?
  • 我需要在调用 Connect 方法时更改 IsConnected 状态。但是在我的测试过程中,IsConnected 值应该会改变。它用于测试我的重新连接管理器的实现。在这篇文章 (stackoverflow.com/questions/770013/…) 中,据说 Repeat.Any 会覆盖所有先前的期望,但它不起作用。

标签: c# .net rhino-mocks expectations


【解决方案1】:

您可以通过Do() 处理程序为存根实现一些行为。
这是您的情况的解决方案:

var isConnected = false;

var stub = MockRepository.GenerateStub<IConnected>();

stub
    .Stub(c => c.IsConnected)
    .Do((Func<bool>)(() => isConnected))
    .Return(false);

stub
    .Stub(c => c.Connect())
    .Do((Action)(() => { isConnected = true; }));

现在只是测试:

Console.WriteLine(stub.IsConnected);
stub.Connect();
Console.WriteLine(stub.IsConnected);

但是,如果您重新设计测试以避免需要如此复杂的存根(当然,如果可能的话),那会好得多。可能将测试分成几个测试可能是合适的。

【讨论】:

  • 好的,它正在工作,但我不会像这篇文章中解释的那样改变期望 http://stackoverflow.com/questions/770013/rhino-mocks-how-to-clear-previous-expectations-在一个对象上。这是一个很好的解决方法。比 BackToRecord 和 Replay 更好。
猜你喜欢
  • 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
相关资源
最近更新 更多