2017-08-07 58 views
0

所以我一直在寫一些單元測試,並且有一個失敗的測試不應該失敗,所以我開始調試測試。我查看了這些屬性,調試結束後,測試通過了。奇怪的?所以,我再次進行測試,並再次失敗。Visual Studio調試值在查看它們時發生變化?

原來的特性(在這種情況下的列表視圖項.Selected),當我看着它實際上改變了,但它確實不是我不.....

這裏有一個我製作的視頻展示了這個奇怪的問題。

https://youtu.be/OsUhh-MlOoU

+0

您視頻中的「SelectedItem」是可觀察的集合嗎?可能是因爲填充值需要時間? –

+0

我不知道,但它絕對不是時間基礎。我可以等一個小時,選定的項目數仍然是0.第二我點擊展開箭頭查看詳細信息,它填充 – stefan

+0

您的屬性有副作用。 SelectedItems屬性在其父/擁有對象(其他屬性之一)上展開調試視圖後被填充數據,在評估時也會更改SelectedItems後面的數據。 –

回答

0

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上並將其展開以顯示所有屬性,則會發生完全相同的情況。根據當您擴展xGoodPropertyBadProperty將首先評估,擴展視圖可能顯示或不顯示已更改的GoodProperty值。

+0

您應該更改代碼,因爲您在測試中涉及.NET的GUI代碼,並且應該關注自己編寫的業務邏輯。該測試表明,您將陷入與假設和規則有關的GUI如何工作,這與您要測試的代碼完全正交。因此,您應該分開代碼來操作自己的數據結構並重新測試,然後再有一個將數據結構與GUI集成的適配器/綁定層。 –

相關問題