我想要編寫單元測試我們的XAML綁定跑,我發現傑里米Likness'博客失敗:Silverlight的單元測試完美運行交互方式,但是當通過自動化測試套件
http://csharperimage.jeremylikness.com/2010/08/unit-testing-xaml-data-bindings-in.html
,但我發現並非所有的測試都在運行。測試將全部通過綠色,但是當我通過調試器檢查時,我可以看到在一次運行測試1,2和4(說)被解僱,並且下一次測試1,3和5(說)會被解僱。因此,我們不能依靠他們來驗證代碼是否正確。
進一步的調查使我謝爾蓋Barskity的博客:
與此唯一的問題是,我發現,除非我包裹「TestPanel.Children.Add(的TargetView)」呼叫的「 EnqueueCallBack「包裝我無法保證在執行實際測試之前已經設置了綁定。
所以我已經結束了下面是我的測試代碼:
[TestMethod]
[Description("Tests that the active CheckBox is databound correctly")]
[Tag("Location")]
[Asynchronous]
public void TestActiveCheckBox()
{
var activeCheckBox = GetUIElement<CheckBox>("chkActive");
EnqueueCallback(() => TestPanel.Children.Add(TargetView));
EnqueueCallback(() => { _viewModel.Active = true; });
EnqueueCallback(() => Assert.AreEqual(activeCheckBox.IsChecked,
_viewModel.Active,
"Failed to data-bind active flag."));
EnqueueCallback(() => { activeCheckBox.IsChecked = false; });
EnqueueCallback(() => Assert.AreEqual(activeCheckBox.IsChecked,
_viewModel.Active,
"Failed to update active flag."));
EnqueueTestComplete();
}
這是測試的複選框,然後在視圖模型變量之間的綁定。視圖的DataContext設置爲視圖模型和視圖代碼:
<CheckBox Grid.Column="4" x:Name="chkActive"
IsChecked="{Binding Active, Mode=TwoWay}"
Content="Active" />
並沒有正確實施的INotifyPropertyChanged
界面上的視圖模型的布爾屬性。
當測試以交互方式運行時,此工作正常,但是當通過StatLight在構建機器上運行測試時,它們在第一個Assert.AreEqual
時失敗。看來綁定還沒有真正建立起來。我能想到的唯一原因是該視圖尚未加載。這將與之前依靠TargetView.Loaded
事件觸發的測試化身相結合,這似乎並沒有發生。
因此,如何讓a)讓StatLight真正實例化視圖或b)強制綁定而不加載視圖?
更新
我還張貼了這個問題StatLight討論頁上:
http://statlight.codeplex.com/discussions/262473
一個解決方案已經公佈這似乎首先要解決的問題:
你用「-b」選項運行它嗎?如果你不這樣做,你應該看到類似於「嘗試使用Silverlight測試框架的TestPanel」,要使用它,你需要在StatLight中使用-b選項
我們也使用TeamCity在我們辦理登機手續時自動生成,這需要使用--teamcity
選項。但是,它們似乎是相互排斥的,因爲同時添加-b
和--teamcity
意味着沒有任何測試運行,也沒有報告任何錯誤。