я могу использовать Moq, чтобы получить значения, которые передаются в открытый метод объекта, который не является ложным? - PullRequest
0 голосов
/ 05 апреля 2011

Я пишу юнит-тест для FluentMigrator. Я тестирую метод, который вызывается n раз подряд. То, что я хотел бы сделать, это взять последовательные входные данные и поместить их в SortedList, чтобы я мог проверить, что методы были вызваны в правильном порядке, а затем передать эти входные данные фактическому методу - как временное перенаправление. Но, прочитав документы и т. Д., Я не могу заставить его работать.

Код в тесте:

        var listOfVersions = new SortedList<int, long>();
        int i = 0;

        var runnerMock = Mock.Get(_runner); // runner is a MigrationRunner
        runnerMock.Setup(r => r.RollbackToVersion(2))
            .Callback((long v) =>
            {
                listOfVersions.Add(i, v);
                i++;
                _runner.RollbackToVersion(v, true);                 });

        _runner.RollbackToVersion(2);  

Ошибка:

System.ArgumentException : Object instance was not created by Moq.
Parameter name: mocked

Я родом из Кротов, где погружение в поведение объекта и затем перенаправление его не является необычным. Может быть, это в Мок?

1 Ответ

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

Нет. Действительно насмешливые рамки делятся на 2 лагеря. Те, кто может издеваться над чем-либо, а кто-то другой - только над интерфейсами, абстрактными / виртуальными методами.

Это потому, что они используют очень разные технологии перехвата. Moq, RhinoMocks и т.д. используют динамический прокси-генератор Касла под капотом, который все это создает экземпляр, который предоставляет тот же общедоступный интерфейс. Он использует это для записи взаимодействий с этим объектом, чтобы вы могли проверить его. Абстрактные и виртуальные члены могут быть обмануты, потому что они могут быть производными от этого класса и предотвращать обращения к базовому классу.

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

Если вы хотите смоделировать конкретные не переопределяемые методы, вам придется использовать эти последние фреймворки.

...