C# nssubstitute虚拟getter使用ForPartsOf返回替换抛出异常

C# nssubstitute虚拟getter使用ForPartsOf返回替换抛出异常,c#,mocking,nsubstitute,C#,Mocking,Nsubstitute,我试图模拟对象的一个属性 有一个类似的问题: 但被接受的答案对我不起作用 void Main() { var obj = Substitute.ForPartsOf<MyObject>(); //WORKS, But I need a partial mock!: //var obj = Substitute.For<MyObject>(); obj.PropClass.Returns(Substitute.For<PropClas

我试图模拟对象的一个属性

有一个类似的问题: 但被接受的答案对我不起作用

void Main()
{
    var obj = Substitute.ForPartsOf<MyObject>();
    //WORKS, But I need a partial mock!:
    //var obj = Substitute.For<MyObject>();

    obj.PropClass.Returns(Substitute.For<PropClass>());

    //It's suggestion, Fails, same error:
    //var returnValue = Substitute.For<PropClass>();
    //obj.PropClass.Returns(returnValue);

    //Fails, same error:
    //Lazy implementation of *similar question*
    //Func<PropClass> hello = () => Substitute.For<PropClass>();
    //obj.PropClass.Returns(x => hello());

    //Fails, same error:
    //I believe what *similar question* suggests
    //obj.PropClass.Returns(x => BuildSub());

    obj.PropClass.Dump("Value");
}

public class MyObject
{
    public MyObject()
    {
        _propClasses = new List<PropClass>();
    }
    private readonly IList<PropClass> _propClasses;
    public virtual IEnumerable<PropClass> PropClasses { get { return _propClasses; } }
    public virtual PropClass PropClass { get { return PropClasses.FirstOrDefault(); } }
}
public class PropClass
{
}

public PropClass BuildSub()
{
    return Substitute.For<PropClass>();
}

好吧,这有点棘手。首先,解决方案是停止调用基本实现:

obj.When(x => { var get = x.PropClass; }).DoNotCallBase();
obj.PropClass.Returns(prop);
现在解释一下。NSubstitute记录对替换进行的调用,当我们调用
返回
时,它会捕获最后一次调用并尝试将其配置为返回特定值

运行
obj.PropClass.Returns(prop)
时发生的情况是调用真正的
obj.PropClass
,然后调用
obj.PropClass
,因此NSubstitute现在认为
obj.PropClass
是最后一次调用。当
PropClasses
需要
IEnumerable
时,
返回
然后尝试返回单个
PropClass
,因此出现异常

上面的修复程序停止了
obj.PropClass
立即调用基本实现,因此最后一次调用不会被
PropClasses
one替换,
返回的
可以按预期工作


诚然,这是非常糟糕的,也是我们长期坚持将部分模拟放入NSubstitute的原因之一。NSub良好的语法代价是它不能总是区分开发人员何时配置调用和何时需要运行真正的代码。很抱歉造成混淆。

如果您经常遇到这个问题,请告诉我好吗?我们可能不得不更改部分mocksapi,使配置更复杂,但工作更可靠。我们有另一种方法可以切换。非常接近。。。明确尝试了
obj.When(x=>{var get=x.PropClass;}).DoNotCallBase()返回(prop)
(不起作用)我也尝试过这个解决方案,类似于胸腺嘧啶,我运气不好。要使上述答案起作用,请确保将属性设置为可重写。尝试对methodA被具体对象的methodB使用的方法执行相同的操作,我希望为methodB测试用例代理methodA。
obj.When(x => { var get = x.PropClass; }).DoNotCallBase();
obj.PropClass.Returns(prop);