繁体   English   中英

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

[英]Substitute read only property in partially mocked object

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

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

这是我到目前为止所尝试的:

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

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

然而,只要访问UserInfo,就会抛出异常。

基类的属性是:

public UserInfo UserInfo
{
    get
    {
        // HttpContext dependent stuff
    }
}

我已经尝试将基类属性设置为虚拟,但后来我得到了Castle代理异常。

我想你可能有另一个问题。 NSubstitute能够处理虚拟属性的替换。 这是一个小程序,说明

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的使用我认为不可能以这种方式覆盖属性,因为没有办法通知NSubstitute我们不希望它调用基本代码。 这就是为什么文档提到不建议使用 partial sub的原因

您可以更改基类以返回虚函数的值; 然后将替换此虚函数。 呼叫者没有签名变更。 虽然这是一个黑客,你会得到你需要的

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM