Как смоделировать/изолировать внутренние классы в VS 2012 с помощью прокладок Fakes Framework?

Итак, проблема в том, что у меня есть куча внутренних классов в моей сборке, которые используются классом, который я хочу протестировать. Поскольку аксессоры были удалены из VS2012, я могу использовать [InternalsVisibleTo], и это прекрасно работает... за исключением случаев, когда я пытаюсь изменить свои внутренние классы, они не видны для платформы Fakes. Я также должен отметить, что конкретный класс, с которым я имею дело, является статическим классом со статическими методами, и я действительно не хочу реорганизовывать все для использования интерфейсов (и использования заглушек) из-за сопротивления организации такому уровню рефакторинга.

Есть ли способ сделать эти внутренние элементы доступными для контекста прокладок в Visual Studio 2012, не прибегая к взаимодействию (буквально) всего?


person Finster    schedule 26.11.2012    source источник


Ответы (1)


На следующей странице описывается, как сделать внутренние типы видимыми для сгенерированной сборки подделок. http://msdn.microsoft.com/en-us/library/hh708916.aspx#bkmk_internal_types

Что говорит:

Генератор кода Fakes создаст типы прокладок и типы заглушек для типов, видимых для сгенерированной сборки Fakes. Чтобы сделать внутренние типы сборки с оболочкой видимыми для Fakes и вашей тестовой сборки, добавьте атрибуты InternalsVisibleToAttribute в код сборки с оболочкой, которые обеспечивают видимость сгенерированной сборки Fakes и тестовой сборки.

Итак, вам нужен InternalsVisibleToAttribute, который предоставляет вашей тестовой сборке доступ к внутренним типам целевой сборки. Другими словами:

[assembly: InternalsVisibleTo("TargetAssembly.Fakes")]
[assembly: InternalsVisibleTo("TestAssembly")]
person Oleg Sych    schedule 26.11.2012
comment
Это действительно так, и все же, когда я попробовал это, ни один из моих внутренних интерфейсов не появился. Я получаю заглушки только для публичных интерфейсов. Я знаю, что первоначальный вопрос был о прокладках - удалось ли вам заставить это работать для заглушки внутренних интерфейсов? - person Ian Griffiths; 31.01.2013
comment
Мы находимся в процессе обновления страницы MSDN. Вам также потребуется InternalsVisibleToAttribute, чтобы разрешить вашей тестовой сборке доступ к внутренним типам из целевой сборки. Другими словами, вам нужно: [сборка: InternalsVisibleTo(TargetAssembly.Fakes)] [сборка: InternalsVisibleTo(TestAssembly)] - person Oleg Sych; 02.02.2013
comment
важное примечание с той страницы msdn, которую я пропустил: The Fakes framework uses the same key to sign all generated assemblies, поэтому открытый ключ при подписании ВСЕГДА должен быть PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc, если вы что-то подписываете! Мне понадобилась целая вечность, чтобы поймать это! - person John Gardner; 09.11.2013
comment
В моем случае у меня есть MyLibrary.dll, и я тестирую ее в MyUnitTestProject с помощью прокладок. Я получил предупреждение о том, что тип не виден для экспорта или сборки. Поэтому я открыл AssemblyInfo.cs для проекта MyLibrary и дал [assembly:InternalsVisibleTo(MyLibrary.Fakes)] - person Ziggler; 21.02.2019