Можно ли издеваться над статическим методом с помощью Rhino.Mocks? Если Rhino не поддерживает это, есть ли образец или что-то, что позволило бы мне сделать то же самое?
Издевательские статические методы с использованием Rhino.Mocks
Ответ 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 создает новый прокси для цели (класс или интерфейс). Таким образом, только наследуемые члены (виртуальные в случае класса, публичные с точки зрения интерфейса) могут быть издевались. Ясно, что статические члены не наследуются, поэтому проблема.