我正在测试MVC控制器,它依赖于从基类的只读属性返回的值。
这个属性的getter会在调用它时引发异常,因为它依赖于HttpContext
(和其他令人讨厌的东西),我宁愿避免嘲笑。
这是我迄今为止所尝试过的:
controller = Substitute.ForPartsOf<MyController>(
Substitute.For<SomeDependency>(),
);
controller.UserInfo.Returns(new UserInfo());
然而,只要访问UserInfo,就会抛出异常。
基类的属性是:
public UserInfo UserInfo
{
get
{
// HttpContext dependent stuff
}
}
我尝试将基类属性设置为虚拟,但后来我得到了Castle代理异常。
答案 0 :(得分:6)
我想你可能有另一个问题。 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我们没有#&# 39; t希望它调用基本代码。这就是文档提到部分子not recommended
您可以更改基类以返回虚函数的值;然后将替换此虚函数。呼叫者没有签名变更。虽然这是一个黑客,你会得到你需要的东西
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);