Moq要求?打败目的?

时间:2011-05-04 01:33:41

标签: c# mocking moq automocking

不需要虚拟化你想要模拟的所有属性访问器有点挫败嘲弄的目的吗?

我的意思是,如果我必须修改我的对象并虚拟化我想要模拟的每一个访问者,我不能继承我的课并自己模拟它吗?

1 个答案:

答案 0 :(得分:3)

你的问题非常有效,但如果你考虑一下,就没有其他方法来模拟一个类。如果你采用一个接口,它只是一个契约,所以模拟框架可以模拟你想要它的方式但是如果你拿一个类,它已经有了它的成员的实现。

因此,为了能够模拟类成员,模拟框架必须从类继承并按要求覆盖成员的行为,为此目的,只有虚拟成员才能工作。

例如。如果你有(我正在展示方法,但属性也是如此)

class Foo
{
    public void Bar()
    {

    }
    public virtual void  virtualBar()
    {

    }
}

然后模拟框架可能会创建类似这样的模拟

public class MockFoo : Foo
{
    public override void virtualBar()
    {
        // mockery action
    }

    public new void Bar()
    {
        // mockery action
    }
}

现在你有了

Foo foo = GetMockObject(); // you get an instance of MockFoo

现在打电话

foo.Bar();

你不打算让它调用实际的实现,但由于它是非虚拟成员,它会调用Foo的{​​{1}}

另一方面,打电话

Bar()

会调用foo.VirtualBar(); 的{​​{1}},因为它是一个虚拟成员,它会根据请求由模拟框架注入行为。