C# 有没有一种方法可以通过NSubstitute对类返回值进行递归模拟

C# 有没有一种方法可以通过NSubstitute对类返回值进行递归模拟,c#,mocking,nsubstitute,C#,Mocking,Nsubstitute,NSubstitute在其声明中指出: 返回接口[…]的方法将自动返回替换项本身 通常这就足够了。但是,当我这样做时: 测试方法: IUnityContainer unity = Substitute.For<IUnityContainer>(); MyMethod(unity); IUnityContainer unity=Substitute.For(); 我的方法(统一); 实际方法: public void MyMethod(IUnityContainer con

NSubstitute在其声明中指出:

返回接口[…]的方法将自动返回替换项本身

通常这就足够了。但是,当我这样做时:

测试方法:

IUnityContainer unity = Substitute.For<IUnityContainer>();
MyMethod(unity);
IUnityContainer unity=Substitute.For();
我的方法(统一);
实际方法:

    public void MyMethod(IUnityContainer container)
    {
        this.container = container;

        myObject = container.Resolve<ISomeObject>();

        myObject.CallSomeMethod();
    }
public void MyMethod(IUnityContainer容器)
{
this.container=容器;
myObject=container.Resolve();
myObject.CallSomeMethod();
}
Resolve方法返回一个类。因此,它没有被嘲笑。这意味着当我调用
CallSomeMethod
时,我在myObject中得到null,并出现null引用异常

如果我能得到一个返回的类是一个mock,那就太好了(除非我已经专门重写了这个接口)


使用NSubstitute有什么方法可以得到这个结果吗?

如果
isomobject
是一个接口,它应该可以正常工作。如果您想获得自动替换类,该类需要有一个默认构造函数,并将其所有公共成员声明为虚拟

我通过了以下测试:

public interface IFactory { T Resolve<T>(); }
public interface ISomeObject { void CallSomeMethod(); }

public class Tests
{
    [Test]
    public void Example()
    {
        var factory = Substitute.For<IFactory>();
        MyMethod(factory);
    }
    public void MyMethod(IFactory container)
    {
        var myObject = container.Resolve<ISomeObject>();
        myObject.CallSomeMethod();
    }
}
公共接口IFactory{T Resolve();}
公共接口对象{void callsomethod();}
公开课考试
{
[测试]
公共无效示例()
{
var factory=替换为();
我的方法(工厂);
}
公共无效MyMethod(IFactory容器)
{
var myObject=container.Resolve();
myObject.CallSomeMethod();
}
}

不会
IUnityContainer。是否解决
返回
t
?因此,如果
T
是一个接口
isomobject
,那么如果调用
container.Resolve()
,NSubstitute应该返回一个模拟的
isomobject
。它没有这样做?事实证明IUnityContainer.Resolve()是一个扩展方法。我猜NSubstitute对扩展方法没有任何作用……啊,很好地找到了。是的,NSub不会拦截ext/static方法。我建议不要将这个答案标记为正确答案,因为真正的答案是您找到的:它在静态/扩展方法上不起作用。