如何在每次调用方法时创建具有不同行为的Rhino Mock

时间:2015-03-03 19:01:06

标签: c# rhino-mocks

我试图弄清楚如何使用rhino mocks创建一个模拟,它将在第一次调用特定方法(BasicPublish)时调用原始方法,第二次抛出异常,然后为所有剩余的调用原始方法调用方法。

原始方法签名如下所示:

public virtual void BasicPublish(
    string exchange, string routingKey, IBasicProperties basicProperties, byte[] body)

这可能吗?

这是我尝试过的,我认为会起作用。我的测试现在称为原始方法。但是在我的方法中设置了一个断点并调试我对BasicPublish的调用后,所有参数都被传递为null。我使用" CallOriginalMethod(OriginalCallOptions.CreateExpectation)"不正确?

        mockModel.Stub(a => a.BasicPublish(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<IBasicProperties>.Is.Anything, Arg<byte[]>.Is.Anything)).CallOriginalMethod(OriginalCallOptions.NoExpectation).Repeat.Once();
        mockModel.Stub(a => a.BasicPublish(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<IBasicProperties>.Is.Anything, Arg<byte[]>.Is.Anything)).Throw(new DivideByZeroException()).Repeat.Once();
        mockModel.Stub(a => a.BasicPublish(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<IBasicProperties>.Is.Anything, Arg<byte[]>.Is.Anything)).CallOriginalMethod(OriginalCallOptions.NoExpectation).Repeat.Any();

附加上下文:这将用于单元测试(使用nunit)来测试自定义Log4Net Rabbit MQ appender的行为。测试用例如下:给定队列的实时连接,当连接出现故障时(通过调用BasicPublish(...)的异常模拟),则忽略该特定日志消息并处理后续日志消息通常

1 个答案:

答案 0 :(得分:0)

我无法找到一种方法与Rhino一起做到这一点,但意识到我可以创建一个假冒自己的行为,就像我期望的那样。这个解决方案在适当的命名约定下非常易读。