2009-06-17 93 views
0

我只是從這裏開始嘲笑一下,我正在嘗試一些我認爲應該很簡單的東西。使用typemock進行鏈接

我有一個讀取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記錄了空值作爲返回值 - 所以我該怎麼辦?我怎樣才能設置模擬返回有效的模擬對象,而不是空值?

注 - 我正在編寫一個.NET 2.0項目,所以我不能使用隔離器功能(我認爲)。這會幫助我嗎?或者,也許切換到犀牛或最小起訂量會讓這一切變得更容易?

回答

2

首先,如果您使用的是舊API,則應該使用MockObject而不是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,請參閱此link

+0

謝謝,我會在我回到家裏並將其標記爲答案時檢查出來。 – 2009-06-18 06:34:19