MOQ - как вручную создать резервное свойство с помощью SetupGet / SetupSet? - PullRequest
8 голосов
/ 07 апреля 2011

Я знаю, что мы можем позвонить SetupAllProperties(), чтобы автоматически создать вспомогательные свойства.Но это слишком ограничительно, потому что не позволяет мне выполнять дополнительный код в getter / setters.Например, я хотел бы создать установщик moq'd, который вызывает некоторый другой метод / событие / логику.

В следующем примере кода воспроизводится проблема

public interface IA
{
    int B { get; set; }
};

class Test
{
    [Test]
    public void BackingPropertyTest()
    {
        int b = 1;

        var mockA = new Mock<IA>();
        //mockA.SetupAllProperties();
        mockA.SetupGet(m => m.B).Returns(b);
        mockA.SetupSet(m => m.B).Callback(val => b = val);

        mockA.Object.B = 2;
        Assert.AreEqual(2, b);              // pass. b==2
        Assert.AreEqual(2, mockA.Object.B); // fail.  mockA.Object.B==1, instead of 2
    }
}

, поскольку получатель являетсяустановка для возврата значения локальной переменной (которая, я думаю, теперь является захваченной переменной), я ожидаю увидеть mockA.Object.B == 2.Но вместо этого, это 1.

Я что-то здесь упускаю?Или это ошибка MOQ?Я использую MOQ 4.0.10501.6

1 Ответ

14 голосов
/ 07 апреля 2011

Простое решение.

Замените Returns (b) на Returns (() => b) вместо того, чтобы сделать 'b' захваченной переменной, а не просто переменной, переданной по значению методу,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...