0

我只是从嘲笑开始,我正在尝试一些我认为应该很简单的东西。

我有一个类可以读取 Google 日历数据。首先,它创建一个CalendarService对象,然后调用Query该对象,接收 aEventFeed并迭代 的 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中仍然为 null,因此将ExpectAndReturnnull 记录为返回值 - 那我该怎么办?如何设置模拟以返回有效的模拟对象,而不是空值?

注意 - 我正在编写一个 .NET 2.0 项目,所以我不能使用 Isolator 功能(我认为)。那会帮助我吗?或者也许切换到 Rhino 或 MOQ 会更容易?

4

1 回答 1

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 no Lambda 语法,它看起来是这样的:

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

请参阅此链接,了解如何设置 VS2005 测试以使用 AAA API。

于 2009-06-18T06:18:28.543 回答