2009-06-17 4 views
0

Я только начинаю здесь с насмешки, и я пытаюсь сделать что-то, что, я думаю, должно быть довольно простым.Использование typemock для цепочки

У меня есть класс, который читает данные календаря Google. Во-первых, он создает объект CalendarService, затем он вызывает Query на этом объекте, принимает EventFeed и выполняет итерации по коллекции предметов AtomEntryCollection. Я хочу, чтобы все это насмехалось, так как я не хочу, чтобы мои тесты отправляли любые веб-запросы. Я попытался насмешливо все это с

var service = MockManager.Mock<CalendarService>(); 
var events = MockManager.MockAll<EventFeed>(); 
var entries = MockManager.MockAll<AtomEntryCollection>(); 
service.ExpectAndReturn("Query", events.MockedInstance); 
events.ExpectGet("Entries", entries.MockedInstance); 
entries.ExpectGetAlways("Count", 3); 

но мой тест не пройден, как только объект, возвращаемый из метода service.Query() используется. Я понимаю, что в 5-й строке entries.MockedInstance все еще был нулевым, поэтому ExpectAndReturn записал нуль как возвращаемое значение - так что я должен делать? Как я могу установить mocks для возвращения действительных макетных объектов вместо нулей?

Примечание. Я пишу проект .NET 2.0, поэтому я не могу использовать функции Isolator (я думаю). Это помогло бы мне? Или, может быть, переключение на Rhino или MOQ сделает все проще?

ответ

2

Во-первых, если вы используете старый API, вы должны использовать MockObject, а не Mock. Mock для объектов, созданных позже в тестируемом коде, MockObject для объекта, который создается теперь.

Но зачем использовать старый API? Лучший способ, который я рекомендую, - написать тесты в .Net 3.5, таким образом, вы получите лучшее из обоих миров. В этом случае ваша установка выглядит следующим образом:

var service = Isolate.Fake.Instance();
Isolate.WhenCalled(() => service.Query().Count).WillReturn(3);
var events = Isolate.Fake.Instance();
Isolate.WhenCalled(() => events.Entries.Count).WillReturn(3);

Однако, если вы в затруднении, чтобы использовать 2.0 не синтаксиса Lambda, это то, как он выглядит:

var service = Isolate.Fake.Instance();
Isolate.WhenCalled(delegate { return service.Query().Count; }).WillReturn(3);
events = Isolate.Fake.Instance();
Isolate.WhenCalled(delegate { return events.Entries.Count; }).WillReturn(3);

Обратитесь к этому link о том, как настроить тест VS2005 для работы с API AAA.

+0

Спасибо, я проверю это, когда вернусь домой и отметю его как ответ. –

+0

Весь интерфейс Isolate и AAA API работает только для .NET 3/3.5. Я работаю над VS2008, но .NET 2.0, поэтому я не могу его использовать. Когда я заменил Mock на MockObject, я получил соответствующие объекты внутри своего SUT, но я не смог заменить свойство Count, чтобы вернуть 3 вместо 0. Мне удалось подделать метод «Содержит», но не другие свойства. Что я делаю неправильно? Или есть какая-то ошибка с подделками? –

+0

Noam, Неправильно. Вы можете использовать AAA для 2.0. Во-первых, вы можете захотеть, чтобы ваши тесты использовали 3.5, поскольку они представляют собой отдельные проекты, чем производственный код. Также посмотрите здесь: http://blog.typemock.com/2008/10/how-to-use-isolator-new-api-in-vs2005.html – user19930

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