2011-07-28 61 views

回答

11

我會讓他們私人的 - 他們不屬於您班級的public interface,這是公共ICommand屬性的用途。

+0

+1測試公共接口。 –

+0

雖然我的班級沒有界面,但它只是一個班級。 – michael

+3

@michael類的「公共」方法和屬性的集合被認爲是類的「接口」,因爲這是消費者與該類接口的接口。 – dlev

4

就我個人而言,我會用私人方法去,我會告訴你爲什麼。你正在公開一個ICommand,對我而言,消費視圖應該在調用Execute之前調用CanExecute。如果他們不這樣做,他們會反對API並在腳下射擊自己,那時它已經失去了你的手。就好像有人用反射來設置一個重要的私有變量,從而導致你的課堂設計無效並因此而崩潰......在腳下自我射擊。那麼爲什麼要讓這些成員保密?因爲不需要公開那些不應該直接調用的成員。


基本上,當你進行單元測試,你不這樣做單獨的成員,您在API打算要執行成員的方式這樣做。所以,你沒有真正測試成員,但另外你正在測試的命令,這又意味着他們應該在一對的特定順序來進行測試:

if (CanExecute) 
{ 
    Execute; 
} 
+0

相當的編輯 - 還是我只是想念的東西? :) –

+0

@chibacity:有時我傾向於咆哮。我之前曾經提過類似單元測試的問題,並且有人告訴我,如果人們違背API,那麼就是這樣。你只能走得這麼遠才能保護某人免於摧毀一個合適的圖書館或應用程序。 –

2

我有MVVM的東西簡單控制增加,減少按鈕和滑塊顯示值。

如果你有測試的ICommand和INotifyPropertyChanged的,你可以做單元測試的類型:

[TestMethod] 
public void TestViewModel3() 
{ 
    int min = -10; 
    int max = 10000; 
    int initVal = 50; 
    bool initState = false; 

    ToglledSliderModel model = new ToglledSliderModel(initState, initVal, min, max); 
    ToglledSliderViewModel viewModel = new ToglledSliderViewModel(); 
    viewModel.Model = model; 

    int status = 567; 
    viewModel.PropertyChanged += delegate 
    { 
     status = 234; 
    }; 

    for (int i = 1; i < 100; i++) 
    { 
     status = 567; 
     ICommand ic = viewModel.IncreaseValue; 
     ic.Execute(this); 
     Thread.Sleep(2); 
     Assert.AreEqual(status, 234); 
     Assert.AreEqual(model.SliderValue, initVal + i); 
    } 
} 

你可以看到,我測試INotifyPropertyChanged的行爲和ICommand的執行