所以我一直在寫一些單元測試,並且有一個失敗的測試不應該失敗,所以我開始調試測試。我查看了這些屬性,調試結束後,測試通過了。奇怪的?所以,我再次進行測試,並再次失敗。Visual Studio調試值在查看它們時發生變化?
原來的特性(在這種情況下的列表視圖項.Selected),當我看着它實際上改變了,但它確實不是我不.....
這裏有一個我製作的視頻展示了這個奇怪的問題。
所以我一直在寫一些單元測試,並且有一個失敗的測試不應該失敗,所以我開始調試測試。我查看了這些屬性,調試結束後,測試通過了。奇怪的?所以,我再次進行測試,並再次失敗。Visual Studio調試值在查看它們時發生變化?
原來的特性(在這種情況下的列表視圖項.Selected),當我看着它實際上改變了,但它確實不是我不.....
這裏有一個我製作的視頻展示了這個奇怪的問題。
的documentation對於SelectedItems有這樣一段話:
selectedItems屬性將不包含任何項目如果創建ListView的句柄之前訪問該屬性。
由於您在測試方法中,我會假設您實際上不會在屏幕上顯示窗體,也不會在列表視圖中顯示需要處理的窗體。因此,在強制執行之前,listview不會得到句柄。
在調試檢查器中展開listview對象的行爲使得SelectedItems屬性突然包含該元素,這些元素向我表明ListView類型的其他屬性之一具有觸發此創建的副作用處理。
這裏是一個演示了類似的情況的一個小例子:
void Main()
{
var x = new Test();
Console.WriteLine(x.GoodProperty); // place a breakpoint on this line
Console.WriteLine(x.BadProperty);
Console.WriteLine(x.GoodProperty);
}
public class Test
{
public int GoodProperty { get; set; }
public int BadProperty => GoodProperty++;
}
如果放置在指定的行斷點,然後用鼠標只是鼠標懸停在同一直線上x.GoodProperty
表達,你會得到0。您可以再次這樣做一遍又一遍,它仍然會產生0.1
但是,每次你的鼠標在x.BadProperty
表達,x.GoodProperty
也將受到1
釷增加時間如果您將鼠標放在x
上並將其展開以顯示所有屬性,則會發生完全相同的情況。根據當您擴展x
時GoodProperty
或BadProperty
將首先評估,擴展視圖可能顯示或不顯示已更改的GoodProperty
值。
您應該更改代碼,因爲您在測試中涉及.NET的GUI代碼,並且應該關注自己編寫的業務邏輯。該測試表明,您將陷入與假設和規則有關的GUI如何工作,這與您要測試的代碼完全正交。因此,您應該分開代碼來操作自己的數據結構並重新測試,然後再有一個將數據結構與GUI集成的適配器/綁定層。 –
您視頻中的「SelectedItem」是可觀察的集合嗎?可能是因爲填充值需要時間? –
我不知道,但它絕對不是時間基礎。我可以等一個小時,選定的項目數仍然是0.第二我點擊展開箭頭查看詳細信息,它填充 – stefan
您的屬性有副作用。 SelectedItems屬性在其父/擁有對象(其他屬性之一)上展開調試視圖後被填充數據,在評估時也會更改SelectedItems後面的數據。 –