2016-06-14 22 views
2

我想在一個簡單的界面使用FakeItEasy 2.0.0僞造一個屬性:FakeItEasy設置屬性沒有獲取訪問?

public interface IPerson 
{ 
    int Age { set; } 
} 

請注意,我沒有get訪問。我試圖寫的測試是:

public void SetsAge() 
{ 
    var fakePerson = A.Fake<IPerson>(); 
    A.CallToSet(() => fakePerson.Age).To(42).MustHaveHappened(); 
    fakePerson.Age = 42; 
} 

但含有A.CallToSet線失敗,編譯:

enter image description here

這是相當不言自明,但令人迷惑,因爲我沒有試圖獲得財產的價值。

我是否必須提供一個get訪問器才能編譯(即使我不想要get訪問器)? 在這種情況下,它需要get訪問器的原因是什麼(當我用DoesNothing替換MustHaveHappened時發生了相同的編譯器錯誤)? 或者我在做一些根本性錯誤?

或者我應該不會失去太多的睡眠和do the right thing首先呢?

+0

一個集合屬性通常是一種代碼味道。我有興趣知道爲什麼你首先要做到這一點。 –

+0

@亞當:我給出的例子只是爲了展示我所看到的問題。實際上,我試圖在Winforms應用程序中創建我認爲是MVP體系結構的東西。視圖界面具有set-only屬性,以允許演示者將正在查看的對象傳遞給它。在視圖中,這個對象然後綁定到UI控件的數據。演示者響應屬性更改通知來更新模型。任何時候視圖和主持人都不需要獲取訪問器來查詢哪個對象被傳遞給視圖,所以我省略了它。我希望這是有道理的! – WalderFrey

回答

3

我必須提供一個get訪問器來獲得這個編譯嗎?

沒有,你可以使用

A.CallTo(fakePerson).Where(call => call.Method.Name == "set_Age" && 
            call.GetArgument<int>(0) == 42) 
        .MustHaveHappened(); 

這在Specifying a call to any method or property記錄。

它需要get訪問器的原因是什麼?

原因是因爲你不能在lamdba表達式中使用=,所以沒有簡單的方法來引用屬性設置器。在2.0版中,我們增加了A.CallToSet以允許您使用getter進行作弊,但當然它只在存在getter時才起作用。

我們還沒有拿出一個優雅的方式來引用一個無吸引力的setter,所以你必須使用上面的A.CallTo的強大版本。

或者我正在做一些根本性的錯誤?

那麼,除了與指該財產的問題,整個A.CallTo…MustHaveHappend()fakePerson.Age = 42後發生,或將報告失敗,因爲你還沒有設置fakePerson.Age42

+0

謝謝布萊爾。這很好。 – WalderFrey

+0

我很高興。請注意,我已經忘記首先檢查我的示例中的值限制。我已經修改過了。 'call.GetArgument (「value」)'也可以,如果你喜歡名稱索引。 –