2016-09-28 89 views
2

我第一次使用FakeItEasy來模擬一個複雜的數據結構。當嘲笑一個對象並設置這樣的屬性時,合夥人不會得到更新。它永遠是錯誤的。FakeItEasy屬性不更新

var @object = A.Fake<MyObject>(); 
@object.MyBooleanProperty= true; 

通過對FakeItEasy文檔閱讀,一個例子表明,這是可以做到:

var @object= A.Fake<MyObject>(); 
A.CallToSet(() => @object.MyBooleanProperty).To(true); 

這裏的問題是,該屬性沒有標記爲虛,這將引發與一個FakeConfiguredException消息:

The current proxy generator can not intercept the specified method for the following reason: 
    - Non virtual methods can not be intercepted. 

關於如何完成這一任何想法?提前致謝。

+2

第一個選項必須工作。如果屬性不是虛擬的,那麼它會執行「真實」的代碼。除非你的屬性的getter返回值基於其他內部方法/屬性被FakeIteasy – Fabio

回答

2

如果該屬性不是虛擬的,那麼執行@object.MyBooleanProperty= true只會調用MyObject實現,因爲FakeItEasy(和其他模擬框架)只能攔截虛擬成員。因此,如果將該屬性設置爲true後該屬性仍然爲false,則必須是因爲它在MyObject中的實現方式。 FakeItEasy在這裏完全沒有涉及。

至於此。

A.CallToSet(() => @object.MyBooleanProperty).To(true); 

這只是意味着「當MyBooleanProperty被設置爲true @object它沒有做任何事情,因爲你沒有指定行爲(InvokesThrowsCallsBaseMethod ... )。爲了幫助檢測這種問題,可以考慮使用FakeItEasy.Analyzer(可on NuGet),它會提醒您未使用的電話規格等常見的錯誤。

此外,A.CallToSet僅用於配置道具erty setter。如果你想配置吸氣劑,你應該使用A.CallTo(() => @object.MyBooleanProperty)。但是,無論如何,如果該房產不是虛擬的,那麼它就無法工作,正如您已經注意到的那樣。

+0

重寫感謝您的詳細信息,非常感謝。我最終爲我的類型創建了接口,並使用FakeItEasy創建了接口的模擬實例。請投票結束這篇文章。 –

+1

@TobiasMoeThorstensen,我不會投票結束這個問題。這是一個很好的問題。如果我可能如此大膽,我會建議如果你對這個答案滿意,你可以贊成它(如果你還沒有)並接受它。 –

+1

只是要注意到一些模擬框架可以攔截非虛擬成員。這種「不受約束」的框架通常是商業廣告 – Fabio