任何人都知道Moq功能语法是否支持非公共属性的设置?我注意到它不起作用。
注意:这是用于功能语法。
public class Foo
{
public virtual int FooProperty { get; protected set; }
}
这不会引发错误,但无法模拟FooProperty
Mock.Of<Foo>(x => x.FooProperty == 1);
常规语法工作正常。
var mockFoo = new Mock<Foo>(); mockFoo.SetupGet(x=>x.FooProperty)
.Returns(1)
答案 0 :(得分:1)
可能值得一看Microsoft Research的Pex / Moles工具。 Moles用于为非公共事物创建访问器。
答案 1 :(得分:0)
如果将程序集属性添加到包含受测试类的程序集(添加到AssemblyInfo.cs),它将支持内部属性的模拟:
// This assembly is the default dynamic assembly generated Castle DynamicProxy,
// used by Moq. Paste in a single line.
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
(当然,您还必须为测试项目添加InternalsVisibleTo条目。)
如果这样做,您可以模拟添加了此内容的程序集中的任何内部属性。如果你想模拟私有或受保护的属性,我很确定没有办法直接这样做。如果它们受到保护,您可以创建一个Dummy继承者并为其提供访问/操纵其受保护成员的公共方法或属性。对于私人而言,我相信你真的无能为力。