Использование typemock для создания цепочек - PullRequest
0 голосов
/ 17 июня 2009

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

У меня есть класс, который читает данные календаря Google. Сначала он создает объект CalendarService, затем вызывает для этого объекта Query, получает EventFeed и выполняет итерацию для коллекции Item 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 записал нулевое значение как возвращаемое значение - так что я должен делать? Как я могу установить, чтобы макеты возвращали действительные фиктивные объекты вместо нулей?

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

1 Ответ

2 голосов
/ 18 июня 2009

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

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);

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

...