2009-06-24 1 views
0

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

Я мог бы сделать это общедоступным для проведения тестовой работы, но это не имеет смысла, поскольку оно является частным по причине. Я мог бы также переместить все в другой класс и сделать там функции публичными, но ссылка на объект в основном классе должна быть либо частной, либо частной.

Я использую Rhino Mocks.

Спасибо за любую помощь :)

+0

, тогда у вас есть проблема с дизайном, а не насмешливая проблема. –

ответ

0

Вытащите файл зависимость, и перейти в интерфейс IFileSomething в конструкторе. Затем издевайтесь над IFileSomething и установите на него ожидание.

3

Если поставить функциональность, что делает чтение файла в класс например

FileReader : IFileReader 

Затем пройти в IFileReader как арг конструктора. вы можете затем издеваться над тем, что

+0

Я голосовал свой ответ, потому что это работает, но я вижу следующие недостатки, обратная связь приветствуется: - Один IFileReader должен сохраняться при жизни объекта, когда он может просто быть использован в одной функции - It делает объект более государственным, чем он должен быть. IFileReader необходимо будет сбросить между последующими вызовами функций, чтобы гарантировать, что функция ведет себя одинаково каждый раз, когда она вызывается, это вводит дополнительную сложность. - Это также приводит к ограничению того, что одновременно может использоваться только один IFileReader, если только нет способа скопировать объект. – CiscoIPPhone

+0

Вы правы, но чтение из файла похоже на выборку из репозитория, и я считаю, что функциональность должна быть разделена. Возможно, если вы используете инъекции зависимостей, такие как Windsor, они могли бы иметь какое-то кеширование. Хотя я действительно не знаю. –

+0

Спасибо за ответ! Я вижу, что он работает, но я бы предпочел не иметь его в качестве аргумента конструктору, из-за недостатков, которые CiscoIPPhone также упоминает. Мне нужно было бы сделать это для каждого объекта, который я использую для внешних данных в частных методах, мне нужно еще немного для других частных методов. Что обычно делают люди, когда им приходится издеваться над частными вызовами метода в публичном методе? – 2009-06-24 12:07:42

0

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

template <class FileReader> 
class SomeClass 
{ 
    private: void doSomething() 
    { 
    FileReader fileReader; 
    // Do something 
    } 
}; 

Другой способ - передать метод в конструктор SomeClass, который возвращает реализацию FileReader. Это можно использовать во всем классе, аналогичном тому, как используется шаблон, но делая это таким образом, вы все равно получите свой MockFileReader от IFileReader.

Проблема с одним из них заключается в том, что модульные тесты не могут выполняться в FileReader, поскольку доступ к нему из SomeClass отсутствует.

n.b. код выше - C++, но я знаю, что оба метода выполняются с C#.

0

Убедитесь, что вы соглашаетесь с самим собой, это сервис или предприятие.

Служба, как правило, признается в том, что она использует набор бизнес-единиц для выполнения определенной задачи и сама по себе не поддерживает долговременные данные.

Бизнес-объект - это подразделение в вашей проблемной области, что бы вы концептуально хотели бы сохранить.

Если вы обнаружите, что это сервис, вы должны каким-то образом ввести зависимость при создании службы. Обычно это может иметь конструктор так: общественного MyService (IFileObject)

Когда строится из основной: вара службы = нового MyService (MyRealFile)

Когда строится из Испытательной установки: вара службы = нового MyService (MyMockedFiled)

Если вы обнаружите, что то, что вы тестируете, на самом деле является бизнес-объектом, вам следует избегать зависимости от Entity. Обычно вы делаете это на один шаг назад и строите класс службы между собой и бизнес-объектом.Служба явно передает бизнес-сущности все необходимые данные. В вашем случае это означает, что служба предоставляет сущности все, что она должна изучать, читая файл.

Служба, таким образом, имеет зависимость от файловой системы и может даже использовать другую (выделенную) бизнес-сущность filereader для чтения файла. Вы никогда не захотите, чтобы бизнес-сущности вызывали вызовы зависимостей изгоев, если вы используете их где-то еще в системе. Их код становится связанным с контекстом, чего вы бы хотели избежать. Бизнес должен быть быстрым, дискретным, определенным и отзывчивым.

Ваше единичное испытание должно быть выполнено в службу, которая может получить зависимость путем инъекции. Если вы обнаружите, что вы тестируете блок бизнес-объекта, то вам не хватает уровня обслуживания.

0

Спасибо за ответы, мой файл cookie удален. Я использовал первый ответ и немного изменил код. Хорошо работает :)

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

  • Нет связанных вопросов^_^