拥有受保护的二传手的Moq财产

时间:2011-01-26 16:17:23

标签: c# .net unit-testing mocking moq

我想要Moq下一个对象:

abstract class Foo
{
    public string Bar { get; protected set; }
}

以便new Mock<Foo>().Bar返回"Blah"

我该怎么做?


fooMock.SetupGet<string>(s => s.Bar).Returns("Blah");

引发

  

失败:System.NotSupportedException:非虚拟成员上的设置无效:s =&gt; s.Date

fooMock.Protected().SetupGet<string>("Bar").Returns("Blah");

引发

  

要指定公共属性StatementSection.Date的设置,请使用类型化重载

2 个答案:

答案 0 :(得分:9)

就像Felice(+1)所说,模拟会创建一个代理,这意味着你需要让事物变得虚拟(所以Moq可以使用它的代理魔法并覆盖属性)。

作为替代方案,如果您只想喷射一个值,您可以手动存根要测试的类并公开获取setter的方法: -

public class FooStub : Foo {
    public SetBar(string newValue) {
       Bar = newValue;
    }
}

答案 1 :(得分:8)

由于模拟是通过创建类的代理来完成的,因此只能虚拟函数/属性“moqued”