我刚刚开始嘲笑,我正在尝试一些我认为应该很简单的事情。
我有一个读取Google日历数据的课程。首先,它创建一个CalendarService
对象,然后在该对象上调用Query
,接收EventFeed
并迭代AtomEntryCollection
的Item集合。
我希望这一切都被嘲笑,因为我不希望我的测试发送任何Web请求。
我试着用
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
将null记录为返回值 - 所以我该怎么做?如何设置模拟以返回有效的模拟对象,而不是空值?
注意 - 我正在编写一个.NET 2.0项目,所以我不能使用Isolator功能(我认为)。这对我有帮助吗?或者转换到Rhino或MOQ会让事情变得更容易吗?
答案 0 :(得分: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);
有关如何设置VS2005测试以使用AAA API,请参阅此link。