如何使用Moq模拟对具体对象的函数调用?

dfe*_*aro 31 tdd unit-testing moq mocking

我怎么能在Moq做到这一点?

Foo bar = new Foo();
Fake(bar.PrivateGetter).Return('whatever value')
Run Code Online (Sandbox Code Playgroud)

我似乎只能找到如何模拟通过框架创建的对象.我想在我创建的具体对象上只模拟一个方法/属性.

在TypeMock中,我会这样做Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value').

有任何想法吗?

Ari*_*sky 53

您应该使用Moq创建Mock对象并将CallBase属性设置为true以使用对象行为.

从Moq文档:CallBase定义为"如果没有期望覆盖成员,则调用基类实现.这被称为"部分模拟".它允许模拟一个类的某些部分,而不必模拟一切.

示例代码:

    [Test]
    public void FailintgTest()
    {
        var mock = new Moq.Mock<MyClass>();
        mock.Setup(m => m.Number).Returns(4);
        var testObject = mock.Object;
        Assert.That(testObject.Number, Is.EqualTo(4));
        Assert.That(testObject.Name, Is.EqualTo("MyClass"));
    }

    [Test]
    public void OKTest()
    {
        var mock = new Moq.Mock<MyClass>();
        mock.Setup(m => m.Number).Returns(4);
        mock.CallBase = true;
        var testObject = mock.Object;
        Assert.That(testObject.Number, Is.EqualTo(4));
        Assert.That(testObject.Name, Is.EqualTo("MyClass"));
    }

    public class MyClass
    {
        public virtual string Name { get { return "MyClass"; } }

        public virtual int Number { get { return 2; } }
    }
Run Code Online (Sandbox Code Playgroud)

  • 确保您正在模拟的方法是虚拟的,因此Moq将能够覆盖它们. (6认同)

Mar*_*ann 13

只有TypeMock Isolator(可能还有Moles)可以执行这些特技.普通动态模拟库只能模拟虚拟和抽象成员.