我想为我的 MySubClass 创建一个模拟。但是,它的一种方法中有一个参数 ref 。 参数 ref 是 MyReference 类型的对象。 问题是:我不能在课堂上使用相同的' reference ' ref ,因此不会遇到任何条件。
var sub = Substitute.For<MySubClass>();
MyReference referenceForMockTest;
sub.MyMethod(Arg.Any<int>(), ref referenceForMockTest).Returns(x => { x[0] = new MyReference(); return true; });
CallerClass caller =new CallerClass();
caller.CallMySubClass();
有什么方法可以使用参数匹配器(或另一种方法)来解决它?
我可能需要类似以下代码的内容:
var sub = Substitute.For<MySubClass>();
MyReference reference;
sub.MyMethod(Arg.Any<int>(), ref Arg.Any<MyReference>()).Returns(x => { x[0] = new MyReference(); return true; });
我的课非常接近这个:
class RootClass
{
MySubClass subclas = new MySubClass();
public void Process(int codeArg)
{
Response response = new Response();
response.code = 12;
//Create MySubClass using a some creational pattern
var MySubClass = createSubClass();
//I wanna mock it!
var isOk = MySubClass.MyMethod(codeArg, ref response);
if (!isOk)
{
throw new Exception();
}
}
}
class MySubClass
{
public bool MyMethod(int firstArg, ref Response response)
{
//Do something with firstArg and Response...
//If everything is Ok, return true
return true;
}
}
struct Response
{
public int code;
public String returnedMsg;
}
答案 0 :(得分:1)
对于您所展示的情况,我建议使用
.ReturnsForAnyArgs(x => ...)
。好消息是,NSubstitute的下一版本正在 您在第二个代码段中显示的语法! :)(这样的代码段 将保持不变!)此功能当前位于存储库中 https://github.com/nsubstitute/NSubstitute,因此,如果您想尝试 您可以立即开始使用NSubstitute的本地版本。
这里还有更多使用out / ref参数的示例: https://github.com/nsubstitute/NSubstitute/issues/459
所以在这种情况下,类似:
MyReference referenceForMockTest;
sub.MyMethod(0, ref referenceForMockTest)
.ReturnsForAnyArgs(x => { x[0] = new MyReference(); return true; });
还要确保您在类中替换的任何方法都是虚拟的,否则NSubstitute将无法使用它们。有关替代类的更多信息,请参见Creating a substitute。