NSubstitute-带有ref / out的参数匹配器问题

时间:2018-10-08 18:23:30

标签: c# nsubstitute

我想为我的 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;
}

1 个答案:

答案 0 :(得分:1)

来自NSubstitute groups post

  

对于您所展示的情况,我建议使用.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