2014-02-04 2 views
1

Итак, я изучаю TDD, используя много ресурсов здесь, на SO, но я просто не могу понять, что я делаю с частными/защищенными объектами, созданными внутри данного метода/конструктора. Допустим, у меня есть строка подключения. Эта строка соединения используется для построения Sqlcommand или Sqlhelper. Ну, я хочу издеваться над этим Sqlhelper, чтобы при тестировании других методов мне не приходилось полагаться на результаты, полученные из моей базы данных. Но я не могу получить доступ к Sqlhelper.Смачивание объектов, созданных в классе, подлежащем тестированию

Как мне обойти это?

ответ

3

В целом он лучше всего (за исключением редких случаев), чтобы проверить только открытый интерфейс класса в целом. Попытайтесь не использовать один из методов обхода (например, частные объекты), если вам действительно не нужно. Доступ к закрытым членам классов в тестах обычно выглядит хорошо, так как меньше кода для записи для тестирования объекта, однако когда все начинает меняться (и они будут), что-либо, получающее доступ к внутренним элементам класса, затрудняет изменение его реализации , это может привести к искажению проекта, если большинство тестов написаны таким образом.

В этом конкретном случае вы взаимодействуете с внешней зависимостью вне вашего контроля (например, 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 не должен знать об этом.

Смежные вопросы