2010-02-21 2 views
3

Я немного запуталсяМожет ли каркас Mock сделать это для меня?

из вики: «Это означает, что истинный издеваться ... выполнения тестов на данных, передаваемых в метод требует в качестве аргументов.»

Я никогда не использовал модульное тестирование или макет. Я думал, что модульные тесты предназначены для автоматических тестов, для чего нужны тесты?

Что я хочу - это объект, заменяющий мою базу данных, которую я могу использовать позже, но все же не знаю, какую базу данных или инструмент orm я использую.

Когда я выполняю свою программу с помощью mocks, могу ли я легко заменить их на POCO позже, чтобы создать сущность, например, работать довольно быстро?

Редактировать: Я не хочу использовать модульное тестирование, но использование Mocks в качестве полной замены для сущностей + базы данных было бы неплохо.

+0

> «Я никогда не использовал модульное тестирование или макет каркаса» => только начинайте с модульного тестирования, чтобы получить представление об этой теме. позже попытайтесь насмехаться. хорошее видео youtube (C#): http://www.youtube.com/watch?v=f60aIlNhMoE или для java смотрите здесь http://java.dzone.com/articles/test-driven-teaching; вы можете найти очень быстрое введение с некоторым кодом здесь: http://mockito.org/ – Karussell

ответ

6

Да, я думаю, вы немного смущены.

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

Позволяет запускать через быстрый пример

у вас есть «() Сохранить» метод, который принимает «Док» объект и возвращает успех флаг «булевой»

public bool Save(Doc docToSave(){...} 

Теперь если вы хотите написать единичный тест для этого метода, вам придется сначала создать объект документа и заполнить его соответствующими данными, прежде чем вы сможете протестировать метод «Сохранить()». Это требует больше работы, чем вы действительно хотите.

Вместо этого можно использовать фреймворк Mocking для создания объекта «Doc» для вас.

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

CreateMock of type Doc 
SetReturnValue for method Doc.data = "some test data" 

Рамки насмешливой создаст фиктивный фиктивный объект типа Doc, который правильно возвращает «тестовые данные», когда это Вызывается свойство .data '.

Вы можете использовать этот фиктивный объект, чтобы проверить свой метод сохранения:

public void MyTest() 
{ 
    ... 
    bool isSuccess = someClass.Save(dummyDoc); 
    ... 
} 

Рамки насмешливый гарантирует, что, когда ваш «Save()» метод обращается свойства на объекте dummyDoc, правильно данные возвращаются , и спасение может произойти естественным образом.

Это немного надуманный пример, и в таком простом случае, возможно, было бы так же просто создать реальный объект Doc, но часто в сложном битном программном обеспечении было бы намного сложнее создать объект, поскольку он имеет зависимости от других вещей или у него есть требования к другим вещам, которые должны быть созданы в первую очередь. Mocking удаляет часть этой дополнительной перегрузки и позволяет вам протестировать только тот метод, который вы пытаетесь протестировать, а также не беспокоиться о тонкостях класса Doc.

Мок-тесты - это просто модульные тесты с использованием издевающихся объектов, а не реальных. Выделенные объекты на самом деле не используются как часть фактического производственного кода.

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

+0

«Если вы хотите что-то, что займет место ваших классов базы данных, чтобы вы могли передумать позже, вам нужно написать интерфейсы или абстрактные классы, чтобы предоставить методы, которые вам нужны, чтобы соответствовать семантике сохранения/загрузки, тогда вы можете заполнить несколько полных реализаций в зависимости от того, какие типы хранилищ вы выберете ». Да интерфейсы ... но мне нужно их реализовать где-то, поэтому мне нужно написать свою собственную POCO как замену базы данных, и эти пользовательские классы должны имитировать класс let, обозначающий сущность framework. – msfanboy

+0

У вас должны быть некоторые объекты данных. Лично я бы построил ваши бизнес-данные в соответствии с вашей бизнес-моделью и забыл о их хранении. Затем вы можете записать свой уровень хранилища для обработки ваших бизнес-объектов (даже если это означает их сопоставление на некоторые сгенерированные классы объектов EF внутри). EF в .net 3.5 не поддерживает POCO, но будет и предстоящая версия .net 4.0. –

2

I думаю что вы ищете Repository Pattern. Эта ссылка предназначена для NHibernate, но общая модель должна работать и для Entity Framework. В поисках этого я нашел Implementing Repository Pattern With Entity Framework.

Это абстрагирует детали фактического O/RM за интерфейсом (или набором интерфейсов).

(я не эксперт по хранилищам, так пожалуйста, напишите лучше разъяснение/ссылку, если кто имеет их.)

Вы можете затем использовать насмешливую (изоляцию) рамка или ручной код фальсифицирует/заглушки во время первоначального развития до принятия решения об O/RM.

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

+0

@TrueWill Я еще проверил вашу ссылку http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx и мне не нравится, потому что он наследует от EntityObject поэтому я занимаюсь разработкой для реализации не интерфейс, PI не уверен, какой ORM я собираюсь использовать, хотя я изучил EF в течение 12 месяцев. Мне не нравится это для местных db 's слишком много причуд ... – msfanboy

+0

@msfanboy - Это не может быть хорошим примером; это всего лишь один, который я нашел для этой структуры. Я определенно рекомендую программировать интерфейсы, а не реализации; это в духе шаблона хранилища. Вы найдете много информации о плюсах и минусах различных ORM на SO. :) – TrueWill

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