使用Moq功能语法设置非公共属性

时间:2011-10-25 09:23:07

标签: moq

任何人都知道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)

2 个答案:

答案 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继承者并为其提供访问/操纵其受保护成员的公共方法或属性。对于私人而言,我相信你真的无能为力。