Когда я впервые начал использовать модульные тесты, я столкнулся с двумя проблемами. Во-первых, была возможность протестировать частные методы и поля, а во-вторых, отставание в поддержании модульных тестов в актуальном состоянии, когда происходила быстрая разработка. Следовательно, я применил подход ниже для моих модульных тестов.
#if UNITTEST
using NUnit.Framework;
#endif
public class MyBlackMagic
{
private int DoMagic()
{
return 1;
}
#if UNITTEST
[TestFixture]
public class MyBlackMagicUnitTest
{
[TestFixtureSetUp]
public void Init()
{
log4net.Config.BasicConfigurator.Configure();
}
[Test]
public void DoMagicTest()
{
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);
Assert.IsTrue(DoMagic() == 1, "You are not a real magician!");
}
}
#endif
}
Я считаю, что этот подход преодолевает две мои проблемы, и это щелчок переключателя прекомпиляции, чтобы убедиться, что все модульные тесты компилируются.
Моя проблема сейчас в том, что я перехожу к новому проекту, в котором говорится об использовании отдельных сборок для проведения модульных тестов. Прежде чем я углублюсь и начну подробно рассказывать о достоинствах подхода внутреннего класса, как показано выше, я хотел бы знать, если кто-то считает, что у него есть какие-либо недостатки?
Edit:
Просто добавим пару моментов вокруг некоторых из упомянутых слабостей:
- Код модульного тестирования никогда не повлияет на производственный код, так как флаг прекомпилятора UNITTEST будет отключен,
- Код модульного теста не делает основной код менее читаемым, поскольку он помещается внизу каждого класса и заключен в директиву региона Visual Studio,
- Я считаю, что внутренний класс модульного тестирования означает, что основной класс на самом деле проще, поскольку нет никаких дополнительных методов или свойств, которые должны быть доступны только для тестирования. Всегда будут случаи, когда вы захотите проверить какое-то внутреннее состояние класса как часть модульного теста рано или поздно ...