c #: публично при отладке, приватно иначе - PullRequest
5 голосов
/ 23 февраля 2011

Есть ли хороший способ сделать так, чтобы при тестировании с NUnit функции были общедоступными, а в противном случае частными?

Было бы неплохо не создавать много постороннего кода.

------------------------ Редактировать -----------------------

Похоже, решения подпадают под 3 типа:

  1. не делайте то, что я пытаюсь сделать.
  2. используйте директивы компилятора.
  3. попробуйте умное решение (например, с помощью InternalsVisibleTo).

Может ли быть способ сделать это программно?т.е. просто создайте новое временное приложение, которое выполняет все protected/private/internal функции public, подключите его к NUnit, запустите там тесты и вернитесь к использованию приватных функций для версии выпуска?

Ответы [ 6 ]

7 голосов
/ 23 февраля 2011

Вместо private <-> public вы можете сделать их internal <-> public, используя InternalsVisibleTo.

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

4 голосов
/ 23 февраля 2011

Вам может не понадобиться, если у вас есть хорошее освещение ваших открытых методов, которые вызывают частные методы, но это, кажется, еще один спор сам по себе.

Это хорошая ссылка о TDD и различных способах сделать это: Как протестировать частные и защищенные методы в .NET

3 голосов
/ 23 февраля 2011

Всегда есть internal, как указали другие, но поскольку это отличается от private и public (и, следовательно, может повлиять на другой код в той же сборке), почему бы не использовать директивы компилятора:

#define DEBUG
//...

#if DEBUG
public int PublicMethod(int x, int y)
{
    return privateMethod(x, y);
}
#endif
2 голосов
/ 23 февраля 2011

Вскоре попробуйте это:

#if DEBUG
public 
#else
private 
#endif
int myMethod(params)
{
   // do something.
}

США как myMethod ();

2 голосов
/ 23 февраля 2011

Попробуйте это:

#if DEBUG
public type MethodName(parameters)
#else
private type MethodName(parameters)
#endif
{
 // method body
}
2 голосов
/ 23 февраля 2011
private int MethodToTest() {...}

#if DEBUG
public int MethodTested()
{
   return MethodToTest();
}
#endif

Test MethodTested ()

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