【问题标题】:Is it possible to train Rhinomocks for arbitrary input?是否可以训练 Rhinomocks 进行任意输入?
【发布时间】:2011-09-27 17:21:44
【问题描述】:

我正在尝试为使用拼写校正器的一段代码设置单元测试。我已经正确注入了代码依赖项,所以在 Rhinomocks 中设置存根不是问题,但是我为测试创建的文本块有 50 个字长,我真的不想有 50 行代码看起来像这样:

spellingCorrector.Stub(x => x.CorrectWord("the")).Return("the");
spellingCorrector.Stub(x => x.CorrectWord("boy")).Return("boy");
spellingCorrector.Stub(x => x.CorrectWord("ran")).Return("ran");

出于我的单元测试的目的,我认为假设单词拼写正确是可以的。有没有办法让 Rhinomocks 简单地遵循关于返回的规则,效果如下:

spellingCorrector.Stub(x => x.CorrectWord(y)).Return(y);

【问题讨论】:

    标签: c# unit-testing mocking rhino-mocks


    【解决方案1】:

    您可以使用IgnoreArguments() 方法:

    spellingCorrector
        .Stub(x => x.CorrectWord(null))
        .IgnoreArguments()
        .Return(y);
    

    这样无论给CorrectWord方法传递什么值,都会返回y


    更新:

    你的评论更清楚了:

    Func<string, string> captureArg = arg => arg;
    spellingCorrector.Stub(x => x.CorrectWord(null)).IgnoreArguments().Do(captureArg);
    

    这将使用作为参数传递的任何值作为返回值。如果您需要对此返回值执行一些转换,请调整 captureArg 委托。

    【讨论】:

    • 关闭,但不是我需要的。我需要它来返回放入的内容,而不是每次都一样。
    【解决方案2】:

    对于像这样复杂的任何事情,不要使用 RhinoMocks,而是编写自己的小存根类。我会用包含所有应该更正的单词的字典来支持它,如果它不在字典中,则返回该单词。

    创建模拟只是为了让这种事情变得更容易。如果使用 mock 不是更容易(或更重要的是,更易读),那就写代码吧。

    【讨论】:

      【解决方案3】:

      如果你不是特别喜欢 Rhinomock,可以使用Moq

      spellingCorrector.Setup(x => x.CorrectWord(It.IsAny<string>()))
          .Returns(x => x);
      

      【讨论】:

        猜你喜欢
        • 2016-09-16
        • 2011-09-05
        • 2017-08-27
        • 1970-01-01
        • 1970-01-01
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        相关资源
        最近更新 更多