2016-02-24 95 views
1

我正在使用FakeItEasy來檢查對屬性的公共setter方法的調用是否已被調用。在C中獲取屬性設置器的方法名稱#

該屬性稱爲Description,而且目前我正在測試它像這樣:

A.CallTo(model) 
    .Where(x => x.Method.Name.Equals("set_Description")) 
    .WithAnyArguments() 
    .MustHaveHappened(); 

這個工作在功能上,使用魔法字符串方法名,不過缺點是,如果我重構該屬性的名稱,測試將失敗,我將不得不在所有測試中手動更改字符串。

理想情況下,我想知道的方式在這片僞做它像:

var setterName = model.GetType() 
         .SelectProperty(x => x.Description) 
         .GetSetterName(); 

A.CallTo(model) 
    .Where(x => x.Method.Name.Equals(setterName)) 
    .WithAnyArguments() 
    .MustHaveHappened(); 

這樣,如果我用鼠標右鍵單擊重構Description屬性,測試將不再需要要被更新。我怎樣才能做到這一點?

+0

順便說一句,如果你這麼傾向,你可以在這裏省略'WithAnyArguments'。 –

+0

這是爲什麼@BlairConrad?如果我沒有具體聲明約束條件,是否帶有'WithAnyArguments'? –

+1

這正是爲什麼。嗯。我不能把@JamesMonger放在這裏。看起來在一開始。啊。因爲「郵件所有者將永遠被通知」。你學到的東西。 –

回答

3

你的僞代碼是在正確的軌道上。

var setterName = model.GetType() 
        .GetProperty(nameof(Description)) 
        .GetSetMethod(); 

注意nameof只適用於C#6

+0

感謝您的幫助,@Dennis_E。我選擇了Terje的答案,因爲它更簡潔一些,不過我很感謝你花時間回答。我也非常感謝你的更強大,因爲它甚至不包含'set_'字符串。再次感謝! –

1

注意,作爲FakeItEasy 2.0.0,如果二傳手有一個getter,以及,你可以使用新的A.CallToSet method

A.CallToSet(() => model.Description).MustHaveHappened();