Поблочное тестирование с фальшивками или насмешками? [закрытый]

http://jehiah.cz/archive/firing-javascript-events-properly

function fireEvent(element,event) {
   if (document.createEvent) {
       // dispatch for firefox + others
       var evt = document.createEvent("HTMLEvents");
       evt.initEvent(event, true, true ); // event type,bubbling,cancelable
       return !element.dispatchEvent(evt);
   } else {
       // dispatch for IE
       var evt = document.createEventObject();
       return element.fireEvent('on'+event,evt)
   }
}

8
задан Uniqe 15 April 2011 в 13:25
поделиться

3 ответа

Еще раз ... другой человек попадает в имитацию антипаттерна. Вы «тестируете фиктивный» или фальшивый объект, который вообще бесполезен. Моки необходимо использовать, чтобы абстрагироваться от зависимостей или сотрудников вашего испытуемого ... а не самого испытуемого.

Во-первых, я бы посоветовал прочитать статью Мартина Фаулера « Моки - не заглушки » . Если вы хотите вернуть значения или настроить ожидания для конкретных аргументов, используйте фиктивный фреймворк вместо подделок Roll-your-own. Подделки обычно используются, чтобы заглушить соавторов ... там, где вам наплевать на соавтора ... например, заглушить сеть или файл ввода-вывода.
Затем прочтите этот аналогичный вопрос SO и ответы на него ..

10
ответ дан 5 December 2019 в 10:04
поделиться

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

Вот пример того, как следует использовать подделку. Вы хотите провести модульное тестирование класса DocumentGenerator. Этот класс использует сервисы ITemplateRepository. Однако для правильного модульного тестирования DocumentGenerator вы хотите убедиться, что он не зависит от каких-либо внешних служб. Таким образом, вы предоставляете DocumentGenerator поддельный ITemplateRepository, который будет возвращать стандартные результаты.

Вот как выглядит код.

public class DocumentGenerator
{
  ITemplateRepository _repo;

  DocumentGenerator( ITemplateRepository repo )
  {
    _repo = repo;
  }

  Doc GenerateDoc()
  {
   ....
   _repo.GetGenericTemplate();
    ....
  }
}


[Test]
public void GenerateDocTest()
{
  ITemplateRepository rep = new FakeTemplateRepository();
  DocumentGenerator docGenerator = new DocumentGenerator( rep );
  Assert.IsNotNull(docGenerator.GenerateDoc());
}

Суть примера в том, что вы тестируете то, что использует подделку. Вы не тестируете саму подделку. Подделка существует, поэтому то, что вы тестируете, не зависит от чего-то внешнего.

5
ответ дан 5 December 2019 в 10:04
поделиться

Прежде всего, изучите изолированную (имитирующую) структуру, например Moq или Rhino Mocks . Это сэкономит вам много времени.

Во-вторых, по возможности избегайте создания имоков и придерживайтесь заглушек. Заглушки просто возвращают значения; вы не выступаете против них. Вместо этого вы утверждаете, что состояние тестируемого класса соответствует вашим ожиданиям. Используйте заглушки для исключения внедренных зависимостей.

Это сложная тема, и вам нужно кое-что прочитать. Книга Ошерова Искусство модульного тестирования дёшево в форме электронной книги, и довольно хорошо объясняет это. Вы также захотите прочитать о Dependency Injection .

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

В ваших примерах основное внимание уделяется подделкам, интерфейсам и тестам. Сосредоточьтесь на тестируемом классе и его желаемом поведении.

Интеграционные тесты тоже имеют значение; вы можете подключить все к тестовой базе данных и убедиться, что все работает. Они, как правило, медленные, в отличие от модульных тестов.

РЕДАКТИРОВАТЬ : Сейчас я читаю Growing Object-Oriented Software, Guided by Tests и ставлю под сомнение мою точку зрения «избегать насмешек». Если у вас есть объекты, которые следуют за Скажи, не спрашивай , то государственное тестирование может быть трудным.

интерфейсы и тесты. Сосредоточьтесь на тестируемом классе и его желаемом поведении.

Интеграционные тесты тоже имеют значение; вы можете подключить все к тестовой базе данных и убедиться, что все работает. Они, как правило, медленные, в отличие от модульных тестов.

РЕДАКТИРОВАТЬ : Сейчас я читаю Growing Object-Oriented Software, Guided by Tests и ставлю под сомнение мою точку зрения «избегать насмешек». Если у вас есть объекты, которые следуют за Скажи, не спрашивай , то государственное тестирование может быть трудным.

интерфейсы и тесты. Сосредоточьтесь на тестируемом классе и его желаемом поведении.

Интеграционные тесты тоже имеют значение; вы можете подключить все к тестовой базе данных и убедиться, что все работает. Они, как правило, медленные, в отличие от модульных тестов.

РЕДАКТИРОВАТЬ : Сейчас я читаю Growing Object-Oriented Software, Guided by Tests и ставлю под сомнение мою точку зрения «избегать насмешек». Если у вас есть объекты, которые следуют за Скажи, не спрашивай , то государственное тестирование может быть трудным.

Я читаю Развитие объектно-ориентированного программного обеспечения, управляемое тестами и ставлю под сомнение мою точку зрения "избегать насмешек". Если у вас есть объекты, которые следуют за Скажи, не спрашивай , то государственное тестирование может быть трудным.

Я читаю Развитие объектно-ориентированного программного обеспечения, управляемое тестами и ставлю под сомнение мою точку зрения "избегать насмешек". Если у вас есть объекты, которые следуют за Скажи, не спрашивай , то государственное тестирование может быть трудным.

2
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: