C# 替换部分模拟对象中的只读属性
我正在测试一个MVC控制器,它依赖于从基类上的只读属性返回的值 这个属性的getter在调用时抛出一个异常,因为它依赖于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(
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);