2013-03-28 31 views
2

方法調用我有一個ClassA的驗證與OCMockito

-(IBAction)onSubmit; 
-(void)validateName:(NSString*)name; 

@implementation

- (IBAction)onSubmit { 
    [self validateName:self.textfield.text]; 
} 

-(void)validateName:(NSString*)name{ 
    // do something 
} 

我的測試看起來像下面這兩種方法:

//given 
ClassA *classA = mock([ClassA class]); 
classA.textfield.text = @"Foo"; 

// when 
[classA onSubmit]; 

[verify(classA) validateName:@"Foo"]; 

但是那並不是」 t工作,我不斷得到:

Expected 1 matching invocation, but received 0 

當我調用onSubmit時,如何編寫一個驗證validateName被執行的測試。

回答

5

正確的單元測試測試內部狀態和外部行爲。你的單元測試正在測試是否你的代碼做了什麼,而不是它如何它做了些什麼。狀態驗證告訴你,你的預期結果已經實現,而行爲驗證告訴你你的協作對象正確地與你的系統進行了接口測試。這允許你做重構等美妙的事情。

內部狀態的試驗是這樣的:

鑑於初始狀態,如果被測系統做了,然後 結果狀態

的外部行爲的測試是這樣的:

如果被測系統做了,那麼其他單位應該做別的事情

第一類測試是用標準斷言(OTCamcrest情況下的assertThat()調用)完成的。第二類測試(正確)通過驗證測試雙打(在OCMockito的情況下爲verify()調用)完成。

嘲笑被測系統沒有任何意義。如果您發現有必要測試內部行爲(即被測系統調用的特定方法),那麼您需要將這些行爲映射到狀態。在您的情況下,這將意味着,ClassA的實現的標誌如BOOL   nameValidated(優選地與吸氣劑isNameValidated)或可變如的NSString   * validatedName

+0

公平不夠重要。謝謝! – Bach