有可能训练Rhinomocks进行任意输入吗?

本文关键字:任意 输入 Rhinomocks 有可能 | 更新日期: 2023-09-27 18:09: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);

有可能训练Rhinomocks进行任意输入吗?

您可以使用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委托。

对于像这样复杂的东西,不要使用RhinoMocks,而是编写自己的小存根类。我会用一个包含所有应该纠正的单词的字典来支持它,如果字典中没有这个单词,就返回它。

创建

mock只是为了使这种事情更容易。如果使用mock不容易(或者更重要的是,不容易读),那么就编写代码。

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

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