Moq的要求吗?违背了目的

本文关键字:违背 Moq | 更新日期: 2023-09-27 17:54:27

难道不需要虚拟化您想要模拟的所有属性访问器就会破坏模拟的目的吗?

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

Moq的要求吗?违背了目的

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

因此,为了能够模拟类成员,模拟框架必须继承类并根据请求重写成员的行为,为此,只有虚拟成员才能工作。

例如

。如果你有(我在展示方法,属性也是一样)

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();

你不打算让它调用实际实现,但由于它是非虚成员,它将调用FooBar()

另一方面,调用
foo.VirtualBar();

将调用MockFooVirtualBar(),因为它是一个虚拟成员,将具有由模拟框架根据请求注入的行为。