Как проверить приватные переменные в NUNit? - PullRequest
6 голосов
/ 20 декабря 2010

У меня есть статический класс с закрытой переменной.

private static Dictionary<strng, string> items = new Dictionary<string, string>();

Многие открытые методы класса обращаются к этому объекту словаря.Теперь я хочу написать тестовый класс NUNit (в другой библиотеке).Как я могу проверить эту приватную переменную?

Ответы [ 4 ]

8 голосов
/ 19 января 2012

Я бы не стал обсуждать погоду, вы должны или не должны тестировать внутренние методы внутреннего класса.Вы можете выставить свои внутренние методы / свойства / классы / и т.д.во внешнюю библиотеку, используя атрибут InternalsVisibleToAttribute .

Например, если ваша библиотека модульного тестирования называется MyUnitTestsLibrary , просто добавьте следующее в AssemblyInfo.csфайл вашего проекта (тестируемый).

[assembly:InternalsVisibleTo("MyUnitTestsLibrary")]

Это сделает библиотеку MyUnitTestsLibrary дружественной библиотекой вашего проекта, которая будет проверена, и предоставит доступ ко всем ее внутренним материалам, чтобы вы моглиМожно делать юнит-тесты.

5 голосов
/ 20 декабря 2010

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

Итак, я хотел бы отметить, что Gallio / MbUnit предоставляет легкий API с именем Mirror для упрощения тестирования с членами закрытого типа .


Пример: следующий пример теста вызывает закрытый метод с именем SomePrivateMethod в экземпляре foo.

[Test]
public void SampleTest()
{
   var foo = new Foo();
   int actual = Mirror.ForObject(foo)["SomePrivateMethod"].Invoke();
   Assert.AreEqual(123, actual);
}
3 голосов
/ 20 декабря 2010

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

3 голосов
/ 20 декабря 2010

Вы не тестируете приватные переменные, вы тестируете поведение класса.

Это означает, что вы должны тестировать только открытый интерфейс класса.

См. Также this вопрос.

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