2017-02-14 17 views
26

В настоящее время я играю с последним кандидатом на выпуск Visual Studio 2017, создав библиотеку .Net Standard 1.6. Я использую xUnit для тестирования моего кода и задаюсь вопросом, можете ли вы все еще тестировать внутренние методы в VS2017.Внутренние методы тестирования модулей в VS2017. Net Standard library

Я помню, что вы могли бы весь класс линии AssemblyInfo.cs в VS2015, что позволило бы указанным проекты, чтобы увидеть внутренние методы

[assembly:InternalsVisibleTo("MyTests")] 

Поскольку нет класса AssemblyInfo.cs в VS2017 .Net стандартных проектов, я был интересно, можете ли вы все еще тестировать внутренние методы?

+3

Вы должны * иметь возможность тестировать свой код только из внешних видимых функций. В конце концов, если никакой логический путь от внешнего кода не сможет достичь этих внутренних методов, то что бы они там делали в первую очередь? – David

+1

@ David Я могу и сделал это, но ранее я провел простые модульные тесты вокруг некоторых внутренних классов. Просто чтобы быть более явным в тестировании. –

+1

AFAIK, вы можете поместить этот атрибут в любой другой файл, за пределами блока 'namespace', и он должен скомпилироваться. В 'AssemblyInfo.cs' не должно быть ничего волшебного. Разве это не работает? Конечно, вам нужно добавить правильное предложение 'using' или использовать полностью квалифицированный атрибут' [сборка: System.Runtime.CompilerServices.InternalsVisibleTo («Something»)]. – Groo

ответ

45

В соответствии с .NET docs for the InternalsVisibleToAttribute:

Атрибут применяется на уровне сборки. Это означает, что он может быть включен в начале файла исходного кода или может быть включен в файл AssemblyInfo в проекте Visual Studio.

Других слов, вы можете просто поместить его в своем собственном произвольно по имени .cs файла, и он должен работать нормально:

// some .cs file included in your project 
using System.Runtime.CompilerServices; 
[assembly:InternalsVisibleTo("MyTests")] 
+1

Да, это работает. Никогда не считал, что один :-) –

+1

@PhilMurray: также кажется, что есть параметр, который должен позволить вам создать «классический» файл AssemblyInfo.cs, как описано [здесь] (http://stackoverflow.com/a/42183749/69809). В противном случае все атрибуты, такие как «описание», «авторское право» и другие вещи, будут храниться внутри файла .csproj. – Groo

2

Атрибут «InternalsVisibleTo» является ключом к любому роду «белым -box "(срок десятилетия, я думаю) для тестирования .Net. Он может быть помещен в любой файл C# с атрибутом «assembly» на передней панели. Обратите внимание, что MS DOC говорят, что имя сборки должно быть квалифицировано маркером открытого ключа, если оно подписано. Иногда это не работает, и нужно использовать полный открытый ключ в своем месте. Доступ к внутренним элементам является ключом к тестированию параллельных систем и во многих других ситуациях. См. https://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054. В этой книге Meszaros описывает различные стили кодирования, которые в основном составляют подход «Дизайн для теста» к разработке программ. По крайней мере, так я использовал его на протяжении многих лет.