Почему я не могу издеваться над MouseButtonEventArgs.GetPosition () с Moq? - PullRequest
2 голосов
/ 17 декабря 2009

Я пытаюсь смоделировать MouseButtonEventArgs.GetPosition() с Moq, но продолжаю получать эту ошибку:

System.ArgumentException: Invalid setup on a non-overridable member:
m => m.GetPosition(It.IsAny<IInputElement>())

at Moq.Mock.ThrowIfCantOverride(Expression setup, MethodInfo methodInfo)  
at Moq.Mock.<>c__DisplayClass12`2.<Setup>b__11()
at Moq.PexProtector.Invoke<T>(Func`1 function)
at Moq.Mock.Setup<T1,TResult>(Mock mock, Expression`1 expression)
at Moq.Mock`1.Setup<TResult>(Expression`1 expression)

Вот код, где я настраиваю свой макет:

    var mockMbEventArgs = new Mock<MouseButtonEventArgs>();
    mockMbEventArgs.Setup(m => m.GetPosition(It.IsAny<IInputElement>())).Returns(new Point(10.0, 10.0));

Я не уверен, что я делаю неправильно, у кого-нибудь есть предложения, как это сделать?

Ответы [ 2 ]

9 голосов
/ 17 декабря 2009

Эта ошибка означает, что вы пытаетесь подделать метод, который не объявлен как virtual .

Moq генерирует тип во время выполнения, чтобы иметь возможность подделать его, сгенерированный тип наследует исходный тип и переопределяет его виртуальные методы. Поскольку не виртуальные методы не могут быть переопределены (это спецификация языка, это не ограничение Moq), невозможно подделать эти методы.

В качестве решения вы можете обернуть класс, который вызывает событие, которое отправляет MouseButtonEventArgs , и передать собственный класс, который объявляет соответствующие методы как virtual . Я думаю, что это может быть небольшой проблемой в вашем случае, но это стоит попробовать.

Другим решением может быть использование изолированной среды, которая позволяет имитировать не виртуальные методы. Например, Typemock Isolator - это фреймворк, который может это сделать. Изолятор использует другой механизм, поэтому позволяет имитировать подобные методы.

Отказ от ответственности - я работаю в Typemock

2 голосов
/ 17 декабря 2009

MouseButtonEventArgs.GetPosition () - неабстрактный, не виртуальный метод. Вы не можете высмеивать его с помощью MOQ, Rhino Mocks или большинства других насмешливых фреймворков.

Это связано с тем, что C # / .NET структурированы: по умолчанию все методы не виртуальные. Сравните это с Java, где все методы являются виртуальными по умолчанию.

Я не использовал его, но я понимаю, что Type Mock позволит вам сделать это, потому что он имитирует, фактически переписывая код, а не просто наследуя, как это делают большинство других фреймворков.

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