【问题标题】:RhinoMocks - Fetching parameters of called functionsRhinoMocks - 获取被调用函数的参数
【发布时间】:2011-01-04 14:41:59
【问题描述】:

使用 RhinoMocks - 我可以获取被调用函数的参数吗?我是说;我可以从函数调用中获取一些未知参数吗?

我有一个模拟,我希望对此调用一些函数。我知道其中一个参数,但另一个未知,因为它来自使用模拟并在其上调用函数的类。更具体地说——在这种情况下——未知参数是一个 lambda 函数。这是一个回调函数,应该在函数执行完成时调用。由于模拟阻止调用回调,我想获取它并自己调用它。

所以;我想检查该函数是否被调用。我想确保某些论点是预期的。然后我想把未知的参数拿出来对它们做一些操作。

假设两个参数都是整数(为简单起见)我想做这样的事情:

int unknownInt; 
_fakeSomething.AssertWasCalled(factory => factory.Foo(1, out unknownInt));
// then play around with unknownInt.. 

这可以吗?我看到有一个 Arg.Out,但不能让它工作..

注意:更新了问题,因为它似乎具有误导性。

【问题讨论】:

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


    【解决方案1】:
    Arg<string>.Matches(arg => you got the argument here...);
    

    更新:

    _fakeSomething 上第一次调用Foo 方法时获取第二个参数:

    string someArg = null;
    var args = _fakeSomething.GetArgumentsForCallsMadeOn(
        x => x.Foo(0, 0), 
        x => x.IgnoreArguments()
    );
    var int = (int)args[0][1];
    

    【讨论】:

      【解决方案2】:

      不确定是否可以完成,但这样的测试可能会导致测试不可靠,因为您不知道传入的实际参数。

      如果可能,对显式数据进行测试。如果你 f.eks 传入 null 而不是一个真实值,你的测试可能会因为错误的原因通过。

      使用 Arg.Is.Anything 进行测试时应小心谨慎,并且在您确实不关心参数时(例如在 AssertWasNotCalled 中)。

      【讨论】:

      • 我不同意你的看法。举一个例子,我有一个我模拟的服务代理。我在创建将使用它的某个类的对象 foo 时注入此服务代理。然后我在对象 foo 上调用一个函数,并且我希望这个函数使用我期望的一些参数调用服务代理模拟上的一个函数,以及一个类私有的回调函数。现在我想检查是否使用预期的参数调用了该函数,但我无法检查私有回调,因此指定 Arg.Is.Anything。我不在乎那个论点,那我为什么不呢?
      • 啊,我明白了。我在测试回调和 lambda 时也遇到了一些麻烦。我得出的结论是我的设计是错误的。测试,尤其是 TDD 的美妙之处在于,它可以告诉你什么时候设计是错误的。我不能告诉你你的设计是否错误,但如果你发现你的代码难以测试,也许你应该重新考虑你的设计。
      猜你喜欢
      • 1970-01-01
      • 2016-02-11
      • 2019-02-19
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多