Как смоделировать вызов функции на конкретном объекте с помощью Moq? - PullRequest
31 голосов
/ 17 марта 2010

Как я могу сделать это в Moq?

Foo bar = new Foo();
Fake(bar.PrivateGetter).Return('whatever value')

Кажется, я могу найти только то, как смоделировать объект, созданный с помощью фреймворка. Я хочу смоделировать только один метод / свойство для конкретного объекта, который я создал.

В TypeMock я бы просто сделал Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value').

Есть идеи?

Ответы [ 3 ]

53 голосов
/ 17 марта 2010

Вы должны использовать 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; } }
    }
13 голосов
/ 17 марта 2010

Только трюки TypeMock Isolator (и, возможно, Moles) могут выполнять эти трюки. Обычные динамические фиктивные библиотеки могут только макетировать виртуальные и абстрактные члены .

3 голосов
/ 20 марта 2010

Родинки также могут заменять приватные методы, если видны подписи. Так что в этом случае это будет выглядеть так:

MFoo bar = new MFoo { // instantiate the mole of 'Foo'
    PrivateGetterGet = () => "whatever value" // replace PrivateGetter {get;}
};
Foo realBar = bar; // retrive the runtime instance
...

Если вам нужна дополнительная информация о родинках, начните с уроков по http://research.microsoft.com/en-us/projects/pex/documentation.aspx.

...