【问题标题】:Returning value that was passed into a method返回传递给方法的值
【发布时间】:2010-11-03 01:17:58
【问题描述】:

我在接口上有一个方法:

string DoSomething(string whatever);

我想用 MOQ 模拟它,以便它返回传入的任何内容 - 类似于:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

有什么想法吗?

【问题讨论】:

    标签: c# mocking moq


    【解决方案1】:

    您可以使用带有输入参数的 lambda,如下所示:

    .Returns((string myval) => { return myval; });
    

    或者更易读:

    .Returns<string>(x => x);
    

    【讨论】:

    • 似乎很容易,直到您需要为具有 7 个参数的方法执行此操作...当我在 Moq 中检查 IReturns 时,它为 Returns >最多4个参数。有什么简单的方法可以解决这个问题吗? /我的意思是除了修改起订量来源/
    • 好的,在Moq v 4.0.0.0 中定义了最多 9 个参数。解决了:)
    • @mizukinakeshu 我会考虑对 9 参数方法进行一些重构,因为听起来类/方法做得太多了。也许将这 9 个参数重构为设置类或结构以帮助您以后?
    • @TheSenator 同意,我不知道这是怎么回事,但我想我只是对我不修改的现有代码一起破解了一些单元测试,否则这个数量的参数肯定会调用用于重构。
    • 请注意,这让我很困惑:.Returns&lt;string&gt; 中的字符串指的是输入参数,而不是您返回的值。
    【解决方案2】:

    更有用的是,如果您有多个参数,您可以通过以下方式访问任何/所有参数:

    _mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
         .Returns((string a, string b, string c) => string.Concat(a,b,c));
    

    您总是需要引用所有参数,以匹配方法的签名,即使您只打算使用其中一个。

    【讨论】:

    • 这应该是公认的答案。这正是您需要做的。其他任何事情都会引发“预期参数数量”异常。
    • 是的,绝对比ReturnsAsync更容易阅读和使用!
    • 这个答案拯救了一天。注意(未来的读者),你也可以更进一步。 .Returns((string a, string b, string c) => { string d = "wow"; return string.Concat(a,b,c,d); } );
    • 就个人而言,这是一个更好的答案。我对起订量知之甚少,但我仍然立即理解。
    • 对于返回 void 的方法,我使用了 .Callback((string a, Exception b, string c) => throw new Exception(b.Message));
    【解决方案3】:

    通用的Returns&lt;T&gt; 方法可以很好地处理这种情况。

    _mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);
    

    或者如果该方法需要多个输入,请像这样指定它们:

    _mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多