Установка атрибута InternalsVisibleTo

Обновлен: Ноябрь 2007

Код может содержать классы, интерфейсы или структуры с квалификатором доступа internal в Visual C# или Friend в Visual Basic. Типы получают этот квалификатор по одной из следующих двух причин:

  • Вы явным образом пометили их как внутренние.

  • По умолчанию классы верхнего уровня, интерфейсы и структуры, не имеющие явно указанного квалификатора доступа, обрабатываются как внутренние.

По умолчанию элементы с квалификаторами private, internal и friend в тестируемом коде не видны, но их все равно можно протестировать. Дополнительные сведения о тестировании закрытых методов см. в разделе Практическое руководство. Тестирование закрытых методов.

Тестирование элементы с квалификатором доступа Internal

При создании методов модульного теста для кода, содержащего внутренние типы, может появиться диалоговое окно Добавление атрибута InternalsVisibleTo. Оно содержит следующий запрос:

Выбрано создание тестов для типа, который помечен как Friend или Internal. Добавить атрибут InternalsVisibleTo в проект <имя проекта>?

Если в исходном проекте включен режим подписи строгого имени, для проекта тестирования также необходимо включить режим подписи. Если этого не сделать, возникнет ошибка компиляции.

В этом сообщении <имя проекта> относится к проекту, содержащему тестируемый код. При положительном ответе сборка тестируемого кода помечается атрибутом InternalsVisibleTo, который делает внутренние типы сборки видимыми для тестового проекта. Это позволяет выполнять модульные тесты для внутренних типов.

Bb385840.alert_note(ru-ru,VS.90).gifПримечание.

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

Если ответить "Нет", то внутренние типы в тестируемой сборки обрабатываются так, как если бы они имели модификатор доступа private. В этом случае при создании теста создается закрытый метод доступа, обеспечивающий тестовой сборке доступ к этим типам, и внутренним, и закрытым. Сборка закрытого метода доступа появится в папке Test References тестового проекта.

Атрибут InternalsVisibleTo или метод доступа Private: что выбрать?

Сборку закрытого метода доступа можно использовать для доступа к закрытым и внутренним членам. Если в тестируемом коде есть внутренние члены, но нет закрытых, лучше использовать атрибут InternalVisibleTo и не создавать сборку закрытого метода доступа. Если же в коде есть и закрытые, и внутренние члены, которые нужно протестировать, используйте закрытый метод доступа, поскольку он обеспечивает доступ к обоим типам членов. Дополнительные сведения см. в разделе Использование закрытых методов доступа.

Требования к подписанию сборок со строгими именами

Во втором абзаце диалогового окна Добавление атрибута InternalsVisibleTo содержится информация о подписании строгих имен. Это означает, что при сборки решения возникнет ошибка компилятора, если не включить подписание строгих имен нужным образом:

  • Если для сборки тестируемого кода включено подписание строгих имен, оно также должно быть включено для тестовой сборки. В этом случае требуется подписанная форма атрибута InternalsVisibleTo. Пример.

    [InternalsVisibleTo(“OtherAssembly, PublicKey=12435234fsdaf;l457fwi248ew843872r892r”)]

  • Если для сборки тестируемого кода подписание строгих имен не включено, его можно не включать для тестовой сборки. В этом случае можно использовать неподписанную форму атрибута InternalsVisibleTo.

    [InternalsVisibleTo(“OtherAssembly”)]

    Bb385840.alert_note(ru-ru,VS.90).gifПримечание.

    Если нажать кнопку "Да" в диалоговом окне Добавление атрибута InternalsVisibleTo, в Visual Studio будет добавлена простая форма атрибута InternalsVisibleTo без открытого ключа.

При инструментировании сборки тестируемого кода для сбора данных о покрытии также следует учесть подписание строгих имен. Дополнительные сведения см. в разделе Инструментирование и повторная подпись сборок.

См. также

Задачи

Практическое руководство. Тестирование закрытых методов

Основные понятия

Использование закрытых методов доступа