如何使用Rhino mock模拟流畅的界面

时间:2011-11-30 01:13:47

标签: c# .net mocking rhino-mocks rhino

以下是流畅的界面:

public interface IReporter<in T,out TResult>
{
    IReporter<T, TResult> Add(T seed);
    TResult Prepare();
}

在代码中使用:

string errorReport = ErrorReporter.Add(exception).Prepare();

模拟测试用例:

        With.Mocks(mockRepository)
            .Expecting(() =>
                           {
                               Expect.Call(errorReporter.Add(null)).IgnoreArguments();
                               Expect.Call(errorReporter.Prepare()).Return(string.Empty);
                               Expect.Call(notifier.Notify(null)).IgnoreArguments().Return(true);
                           })
            .Verify(() =>
                        {
                            ITransporter transporter = new Transporter
                            {
                                ExpectedArgsLength = 1,
                                Notifiers = notifiers,
                                ErrorReporter = errorReporter
                            };
                            transporter.Run(new string[] { });
                        });

错误:

Rhino.Mocks.Exceptions.ExpectationViolationException:IReporter`2.Prepare();预期#1,实际#0。

如果我评论Expect.Call(errorReporter.Prepare())。Return(string.Empty);然后它对我有用。

我错过了什么吗?请帮忙!

1 个答案:

答案 0 :(得分:1)

Expect.Call(errorReporter.Add(null)).IgnoreArguments().Return(errorReporter);

你需要告诉模拟对象将对调用Add期望的对象返回到Add,以便将这些调用链接在一起。说实话,我很惊讶当Add返回null并且在空引用上调用Prepare时,它不会因nullreferenceexception而失败。