Модульные тесты должны фокусироваться на поведении, а не на реализации.Поэтому написание теста для проверки того, что определенные аргументы установлены или переданы, не добавляет значимости вашей стратегии тестирования.
Поскольку приведенный пример, по-видимому, связывается с вашей базой данных, его нельзя действительно рассматривать«модульный тест», так как он должен взаимодействовать с физическими зависимостями, которые имеют дополнительные настройки и предварительные условия, такие как доступность среды, схема базы данных, существующие данные, хранимые процедуры и т. д. Любой тест, который вы пишете, фактически также проверяет эти предварительные условия.
В своем нынешнем состоянии лучше всего для этих типов тестов лучше всего проверить поведение класса - вызвать метод в вашем хранилище и затем проверить, что результаты соответствуют вашим ожиданиям.Однако вы внезапно поймете, что здесь скрытая стоимость: база данных поддерживает состояние между запусками теста, и вам потребуется дополнительная логика настройки или разборки, чтобы убедиться, что база данных находится в известном состоянии.
Хотя я понимаю, что целью вопроса было тестирование «черного ящика», кажется очевидным, что в вашем API есть какая-то скрытая магия.Я предпочитаю решать общеизвестную проблему состояния - использовать базу данных в памяти, ориентированную на текущий тест, которая изолирует меня от условий среды и позволяет распараллеливать интеграционные тесты.Держу пари, что при нынешнем дизайне нет «шва» для программного введения конфигурации базы данных, поэтому вы «зажаты».По моему опыту, магия причиняет боль.
Однако небольшое изменение существующего дизайна решает эту проблему, и "магия" исчезает:
public class PersonRepository : IPersonRepository
{
private ConnectionManager _mgr;
public PersonRepository(ConnectionManager mgr)
{
_mgr = mgr;
}
public PersonCollection FindPersonsByNameAndCity(string personName, string cityName)
{
using (var p = _mgr.CreateProfiler("somekey"))
{
var sp = new PersonStoredProcedure(p);
sp.addArguement("name", personName);
sp.addArguement("city", cityName);
return sp.invoke();
}
}
}