В целом он лучше всего (за исключением редких случаев), чтобы проверить только открытый интерфейс класса в целом. Попытайтесь не использовать один из методов обхода (например, частные объекты), если вам действительно не нужно. Доступ к закрытым членам классов в тестах обычно выглядит хорошо, так как меньше кода для записи для тестирования объекта, однако когда все начинает меняться (и они будут), что-либо, получающее доступ к внутренним элементам класса, затрудняет изменение его реализации , это может привести к искажению проекта, если большинство тестов написаны таким образом.
В этом конкретном случае вы взаимодействуете с внешней зависимостью вне вашего контроля (например, SqlHelper), я бы рекомендовал обернуть объект SqlHelper в свой собственный объект, который реализует интерфейс ISqlHelper (или более разумно названный интерфейс для вашего сценарий).
например.
public interface ISqlHelperWrapper
{
void ExecuteQuery();
}
Затем вводят это через конструктор вы будете тестируемый объект:
public class SqlConsumer
{
private ISqlHelperWrapper _sqlHelper;
public SqlConsumer(ISqlHelperWrapper helper)
{
this._sqlHelper = helper;
}
public void QuerySomething()
{
this._sqlHelper.ExecuteQuery();
}
}
это не только лучший дизайн (вы изолировали реализацию SQL конкретные вещи из SqlConsumer, и учитывая, что было меньше причин для изменения). Но теперь вы можете высмеять экземпляр ISqlHelper, используя насмешливую структуру, а также переключите реализацию на построение.
С учетом вашего сценария соединения выше, вы можете инициализировать sqlhelperwrapper (для этого есть более подходящие имена) с помощью строки соединения, а объект SqlConsumer не должен знать об этом.