Пересмешивание статических методов с использованием Rhino.Mocks - PullRequest
46 голосов
/ 12 февраля 2009

Можно ли смоделировать статический метод с помощью Rhino.Mocks? Если Rhino не поддерживает это, есть шаблон или что-то, что позволило бы мне сделать то же самое?

Ответы [ 6 ]

71 голосов
/ 04 мая 2009

Можно ли издеваться над статическим методом используя Rhino.Mocks

Нет, это невозможно.

TypeMock может сделать это, потому что он использует профилировщик CLR для перехвата и перенаправления вызовов.

RhinoMocks, NMock и Moq не могут этого сделать, потому что эти библиотеки проще; они не используют API CLR-профилировщика. Они проще в том, что они используют прокси для перехвата виртуальных членов и вызовов интерфейса. Недостатком этой простоты является то, что они не могут высмеивать определенные вещи, такие как статические методы, статические свойства, запечатанные классы или не виртуальные методы экземпляров.

22 голосов
/ 12 февраля 2009

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

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

Если вы не можете использовать TypeMock для перехвата вызова метода, рекомендуется использовать шаблон для создания прокси-сервера, который пересылает не виртуальные или статические методы, которые вы хотите проверить, а затем установить ожидание на прокси-сервере. Для иллюстрации рассмотрим следующие классы.

class TypeToTest
{
    public void Method() { }
}

interface ITypeToTest
{
    void Method();
}

class TypeToTestProxy : ITypeToTest
{
    TypeToTest m_type = new TypeToTest();

    public void Method() { m_type.Method(); }
}

Создав этот прокси, вы теперь можете использовать ITypeToTest вместо того места, где вы проходили, или установить экземпляр TypeToTest, убедившись, что реализация по умолчанию использует TypeToTestProxy, так как он переходит к реальной реализации. Затем вы можете создать макет ITypeToTest в своем тестовом коде и соответственно установить ожидания.

Обратите внимание, что создание этих прокси может быть очень утомительным, подверженным ошибкам и длительным. Для решения этой проблемы у меня есть библиотека и набор инструментов, которые генерируют сборки, содержащие эти типы для вас. Пожалуйста, обратитесь к этой странице для получения дополнительной информации.

4 голосов
/ 05 ноября 2009

Это самый большой недостаток для Rhino Mocks. Я не знаю, возможно ли, чтобы Rhino Mocks реализовал это без переосмысления того, как он делает это.

4 голосов
/ 13 февраля 2009

Единственная известная мне фреймворк, поддерживающая статическую имитацию, - это TypeMock.

Как предположил Ритмис, вам нужно обернуть статику во что-то (то есть класс экземпляра с виртуальными методами или интерфейсом), которое затем можно будет смоделировать.

2 голосов
/ 21 августа 2009

Я издевался над moq, я не думаю, что мы можем смоделировать статические члены, используя это, потому что moQ создает новый прокси для цели (класса или интерфейса). Таким образом, только наследуемые члены (виртуальные в случае класса, общедоступные с точки зрения интерфейса) могут быть смоделированы. Ясно, что статические члены не наследуются, поэтому проблема.

...