2014-02-21 3 views
2

У меня есть класс A, который выставляет HttpRequestHeaders как собственность. Испытуемый класс - B.Заменить закрытый класс

  • B использует A.
  • A также является поддельным классом, который используется только для модульного теста.
  • A Наследует интерфейс, который налагает определение свойства HttpRequestHeaders.

Поэтому мне нужно заменить HttpRequestHeaders, так что я могу проверить B К сожалению HttpRequestHeaders закрытый класс, таким образом, она не может быть заменой на NSubstitute:

Не удалось загрузить «Castle.Proxies типа. HttpRequestHeadersProxy_2 'от сборка' DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = a621a9e7e5c32e69 ', потому что родительский тип запечатан.

Какое будет общее решение для преодоления этой ситуации?

+1

Почему вы не нарушаете зависимость между B и A путем сопряжения A? Извлеките интерфейс из A и используйте его в B. –

+0

@AlexPeta это уже так. Интерфейс требует свойство «HttpRequestHeaders». Это не меняет проблему – mathk

+0

ok, затем переходите на один уровень вверх. сделайте свой на поддельной HttpRequestHeadersFake: HttpHeaders и используйте это в реализации FakeA –

ответ

2

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

С положительной стороны, HttpRequestHeaders не имеет слишком большого количества зависимостей. С нижней стороны он имеет только конструктор internal. К счастью, однако, HttpRequestMessage может быть свободно построена и предоставляет объект Headers, который будет выполнять необходимую для вас конструкцию.

В качестве альтернативы вы можете использовать отражение для создания объекта, несмотря на то, что он имеет только конструктор internal - он выбирает ваше время отравления - создайте ненужный, одноразовый объект, чтобы чисто создать заголовки или начать использовать отражение.

1

В зависимости от версии Visual Studio вы используете, попробуйте Подделки (http://msdn.microsoft.com/en-us/library/hh549175.aspx)

Это особенно полезно, если вы не имеете контроля над зависимостями.

+0

Испытали ли вы, что Fake не будет вести себя так же, как NSubstitute? – mathk

+0

У меня нет опыта работы с NSubstitute, но Fakes позволяет вам «подделывать» любой класс, даже если он запечатан. Он даже не должен быть основан на интерфейсе. Это здорово для внедрения модульного тестирования в устаревший код, где у вас есть тип ограничений, которые вы описываете. – iggymoran

+0

Может быть решение, но поскольку я использую NSubstitute, я не хочу, чтобы мой проект загружал его еще одной структурой. благодаря – mathk

 Смежные вопросы

  • Нет связанных вопросов^_^