C# 替换部分模拟对象中的只读属性

C# 替换部分模拟对象中的只读属性,c#,unit-testing,mocking,nsubstitute,C#,Unit Testing,Mocking,Nsubstitute,我正在测试一个MVC控制器,它依赖于从基类上的只读属性返回的值 这个属性的getter在调用时抛出一个异常,因为它依赖于HttpContext(和其他讨厌的东西),我宁愿避免模仿它 这就是我迄今为止所尝试的: controller = Substitute.ForPartsOf<MyController>( Substitute.For<SomeDependency>(), ); controller.UserInfo.Returns(new UserInfo(

我正在测试一个MVC控制器,它依赖于从基类上的只读属性返回的值

这个属性的getter在调用时抛出一个异常,因为它依赖于
HttpContext
(和其他讨厌的东西),我宁愿避免模仿它

这就是我迄今为止所尝试的:

controller = Substitute.ForPartsOf<MyController>(
    Substitute.For<SomeDependency>(),
);

controller.UserInfo.Returns(new UserInfo());

我已尝试将基类属性设置为virtual,但随后出现Castle代理异常。

我认为您可能遇到了另一个问题。NSSubstitute能够处理虚拟属性的替换。下面是一个小程序,说明

public class SubstitutedClass
{
    public virtual int SubstitutedProperty { get { throw new InvalidOperationException(); }  }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var test2 = Substitute.For<SubstitutedClass>();
        test2.SubstitutedProperty.Returns(10);
        Console.WriteLine(test2.SubstitutedProperty);
    }
}

那部分模拟的ForPartsOf呢?@BenFoster事实上,我没有看到ForPartsOf方法,它在本例中不起作用。调查it@BenFoster编辑了我的回答,添加了一些关于
ForPartsOf
的信息。谢谢,问题在于
ForPartsOf
仍然执行原始属性代码。因为我无法更改基类,所以我只是模拟了
ControllerContext
。你能给
MyController
添加一个依赖项来访问
UserInfo
和相关内容吗?在测试时通过一个
FakeUserInfoProvider
,在运行时使用一个
HttpContextSerInfo提供程序
public class SubstitutedClass
{
    public virtual int SubstitutedProperty { get { throw new InvalidOperationException(); }  }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var test2 = Substitute.For<SubstitutedClass>();
        test2.SubstitutedProperty.Returns(10);
        Console.WriteLine(test2.SubstitutedProperty);
    }
}
public class SubstitutedClass
{
    public virtual int SubstitutedProperty { get { return InnerValue(); } }
    public virtual int InnerValue() { throw new InvalidOperationException(); }
}

var test2 = Substitute.ForPartsOf<SubstitutedClass>();
test2.When(t => t.InnerValue()).DoNotCallBase();
test2.InnerValue().Returns(10);