2010-01-13 134 views
10

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

我有一个模拟,我期待一些函数被调用。我知道其中一个参数,但另一个参数是未知的,因为它来自使用模拟并调用函数的类。更具体地说 - 在这种情况下 - 未知参数是lambda函数。这是一个回调函数,应该在函数完成执行时调用。由于模拟可以防止被调用的回调,我想要取回并自己调用它。

所以;我想检查该函数是否被调用。我想确保一些论据是预期的。我想知道未知的论点,然后对它们进行一些操作。

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

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

可以这样做?我看到有一个Arg.Out,但不能完全使它的工作..

注:更新了这个问题,因为它似乎是误导。

回答

14
Arg<string>.Matches(arg => you got the argument here...); 

UPDATE:

要在_fakeSomething魂在Foo方法的第一次调用做出的第二个参数:

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

谢谢。但根据我的理解,这是一个简单的比赛?或者我可以使用它来获取参数?我想把这个论点拿出来。我的问题可能是误导性的,所以我更新了我的问题文本。 – stiank81 2010-01-13 19:39:57

+0

现在更清晰了,看我的更新。 – 2010-01-13 20:08:16

+0

就是这样!谢谢! – stiank81 2010-01-13 22:31:15

0

不知道这是可以做到的,但测试等,其可以导致不可靠的测试,因为你不知道,在传递的实际参数中。

如果可能的话,测试在明确的数据。如果f.eks通过null而不是实际值,那么测试可能会因错误原因而通过。

使用Arg.Is.Any进行测试时应该仔细地进行测试,当您真的不关心参数时,比如在AssertWasNotCalled中。

+0

我不同意你的看法。举一个例子,我有一个服务代理,我模拟。我在创建将使用它的某个类的对象foo时注入此服务代理。然后我调用了对象foo上的一个函数,我期望这个函数可以用我期望的一些参数调用服务代理模拟函数,也可以调用该类的私有回调函数。现在我想检查函数是否以期望的参数被调用,但我无法检查私有回调,因此指定Arg.Is.Anything。我不在乎那个论点,那为什么不呢? – stiank81 2010-01-13 18:36:52

+1

啊,我明白了。我在测试回调和lambda时也遇到了一些麻烦。我得出了我的设计是错误的结论。 关于测试,尤其是TDD的美妙之处在于它告诉你何时设计出错。无论你的设计是否错误,我都不能告诉你,但是如果你发现你的代码很难测试,也许你应该重新考虑你的设计。 – Henning 2010-01-14 08:41:56