Хотя использование !important
редко является хорошей идеей, поскольку вы заметили себя, так как это боль, чтобы перезаписать без использования !importnat
еще раз, я считаю, что у TB есть веская причина для этого для гибких утилит.
Если вы заявите, что хотите, т.е. кнопку, чтобы она не была видна, т.е. небольшие дисплеи, установив класс hidden-sm
на эту кнопку, вы никогда не хотите, чтобы он был видимым на небольших дисплеях. Если вы не будете использовать важный для этого класса утилиты, и вы бы это сделали. хотите, чтобы кнопка блока на всех других размерах дисплея добавила класс .btn-block
, ваша кнопка снова станет видимой на маленьких дисплеях, так как .btn-block
возвращает свойство display
обратно в block
. Или, по крайней мере, это могло в зависимости от порядка вещей, поскольку .hidden-sm
и .btn-block
имеют одинаковую специфичность, когда дело доходит до каскадных правил css.
Ничто не может сделать с этим без !important
. Таким образом, это один из крайних случаев, когда вам нужно будет использовать его, чтобы гарантировать правильное поведение.
Но вы правы в вопросе этого, !important
следует использовать только в качестве последнего средства!
Я определенно рекомендую выделять Ваши тесты к отдельному проекту. Это - единственный способ пойти, по-моему.
Да, как Gary говорит, он также вынуждает Вас протестировать поведение через открытые методы вместо того, чтобы играть с внутренностями Ваших классов
Я всегда создаю отдельную Высшую точку. Материал. Тестовый проект, который компилируется отдельно.
обратный аргумент: Почему Вы хотите вынуть тесты? Почему бы не поставить тест? При поставке тестов наряду с исполнителем тестов, у Вас есть некоторый уровень приемочного испытания и сам тест, поставленный с продуктом.
я услышал этот аргумент несколько раз и думал об этом, но я лично все еще сохраняю тесты в отдельном проекте.
Я определенно соглашаюсь со всеми остальными, что необходимо разделить тесты от производственного кода. Если Вы настаиваете не, однако, необходимо определить условное выражение comiplation постоянный названный ТЕСТ и обернуть все классы модульного теста с
#if TEST
#endif
сначала, чтобы гарантировать, что тестовый код не компилирует в производственном сценарии. Как только это сделано, необходимо или быть в состоянии исключить тест dlls из производственного развертывания, или еще лучше (но более высокое обслуживание), создать NAnt или MSBuild для производства, которое компилирует без ссылок на тест dlls.
Для каждого проекта существует соответствующий.Test проект, который содержит тесты на нем.
, Например, для названного блока, скажите "Высшую точку. BillingSystem. Utils", была бы опытная сборка, названная "Высшая точка. BillingSystem. Utils. Тест".
Исключают его из поставлющейся версии Вашего продукта, не поставляя это dll.
Пока Ваши тесты находятся в отдельном проекте, тесты могут сослаться на кодовую базу, но кодовая база никогда не должна ссылаться на тесты. Я должен спросить, что сбивает с толку о поддержании двух проектов? Можно сохранить их в том же решении для организации.
сложная часть, конечно, когда бизнес имеет 55 проектов в решении, и 60% из них являются тестами. Считайте себя удачливыми.
Я рекомендовал бы отдельный проект для модульных тестов (и все же больше проектов для интеграционных тестов, функциональные испытания и т.д.). Я попытался смешать код и тесты в том же проекте и нашел его намного менее удобным в сопровождении, чем разделение их в отдельные проекты.
пространства имен параллели Поддержания и использование разумного соглашения о присвоении имен для тестов (например, MyClass и MyClassTest) помогут Вам сохраняющий удобную в сопровождении кодовую базу.
Я имею, всегда сохраняют мои модульные тесты в отдельном проекте, таким образом, он компилирует в свой собственный блок.
Еще одна альтернатива использованию директив компилятора в файле или создании отдельного проекта должна просто создать дополнительные .cs файлы в Вашем проекте.
С некоторым волшебством в самом файле проекта, можно продиктовать что:
Пример .csproj выборка:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
...
<Reference Include="nunit.framework" Condition=" '$(Configuration)'=='Debug' ">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\debug\nunit.framework.dll</HintPath>
</Reference>
...
<Compile Include="Test\ClassTest.cs" Condition=" '$(Configuration)'=='Debug' " />
...
</Project>
.Net платформа после v2 имеет полезную функцию, где можно отметить блок с атрибутом InternalsVisibleTo, который позволяет блоку быть полученным доступ другим.
Своего рода функция туннелирования блока.
Как другие указывают, отдельный тестовый проект (для каждого нормального проекта) является хорошим способом сделать это. Я обычно зеркально отражаю пространства имен и создаю тестовый класс для каждого нормального класса с 'тестом', добавленным к имени. Это поддерживается непосредственно в IDE, если у Вас есть Система Команды Visual Studio, которая может автоматически генерировать тестовые классы и методы в другом проекте.
Одна вещь помнить, хотите ли Вы протестировать классы и методы с 'внутренним' средством доступа, состоит в том, чтобы добавить следующую строку к файлу AssemblyInfo.cs для каждого проекта, который будет протестирован:
[assembly: InternalsVisibleTo("UnitTestProjectName")]
Я поместил тесты в отдельный проект, но в то же решение. Предоставленный, в больших решениях могло бы быть много проектов, но проводник решения достаточно хорош при разделении их и если Вы даете всему разумные имена, я действительно не думаю, что это - проблема.
Одна вещь, которую еще нужно рассмотреть, - это то, что версии VisualStudio до 2005 года не позволяли ссылаться на проекты сборки EXE из других проектов. Поэтому, если вы работаете над унаследованным проектом в VS.NET, ваши варианты будут такими:
Из трех условных компиляций наименее подвержены ошибкам.
Если тег #if (DEBUG) допускает чистую «релизную» версию, зачем вам нужен отдельный проект для тестов. Пример nunit LibarryA / B (да, я знаю его пример) делает это. В настоящее время борюсь со сценарием. Использовал отдельный проект, но, похоже, это, возможно, позволит улучшить производительность. По-прежнему хуммин и хавин.