Подтвердить что ты не робот

Издевательские статические методы с использованием Rhino.Mocks

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Если вы не можете использовать 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

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

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

Ответ 5

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

Ответ 6

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