2017-01-10 76 views
0

我正在嘗試使用OCMock庫。我正在嘗試創建類對象的模擬,但它無法驗證該方法。我無法理解測試失敗的原因。如何使用OCMock驗證靜態方法

@interface MyClass:NSObject 
+(void) someMethod; 
@end 
@implementation MyClass 
+(void) someMethod 
{ 

    NSError* error = nil; 
    if (![Utility isValidPropWithError:&error]) 
    { 
     [Logger log:LoggerLevelWarning message:[error localizedDescription] className:className]; 
    } 
} 
@end 

測試:

-(void)testIfLoggerIsset{ 
    id partialMockLogger = OCMClassMock([Logger class]); 
    id partialMockUtility = OCMClassMock([Utility class]); 
    id partialMockClass = OCMClassMock([MyClass class]); 
    NSError *error = nil; 
    OCMExpect([partialMockUtility isValidPropWithError:&error]); 

    [MyClass someMethod]; 

    //This works fine. 
    OCMVerifyAll(partialMockClass); 
    NSString *className = @"classname"; 
    //This is failing... 
    OCMVerify([partialMockUtility isValidPropWithError:&error]); 
    OCMVerifyAll(partialMockUtility); 
    //This is failing... 
    OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]); 
    [partialMockUtility stopMocking]; 
    [partialMockLogger stopMocking]; 
} 

在上面的代碼,雖然[Utility isValidPropWithError:&error];稱爲OCMVerify([partialMockUtility isValidPropWithError:&error]);失敗。

回答

0

這裏有幾件事情:

首先,OCMVerify([partialMockUtility isValidPropWithError:&error]失敗,因爲你期待着您在測試要傳遞給isValidPropWithError:創建NSError對象的地址,但在MyClass +someMethod要創建一個不同NSError對象。兩個不同對象的地址不會相同。

爲了解決這個問題,改變你的期望和核查:

OCMExpect([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg anyPointer]]); 
OCMVerify([partialMockUtility isValidPropWithError:(NSError __autoreleasing**)[OCMArg 

,只是忽略了參數的實際值與預期,這將是一個NSError指針(因爲你創造它的內部someMethod,在調用方法之前無法知道它將會發生什麼)。

其次,由於您已經明確驗證+isValidPropWithError,因此OCMVerifyAll(partialMockUtility)不會驗證任何內容。您應該明確地驗證您的所有期望,或者只需使用OCMVerifyAll(partialMockUtility)並讓它驗證您的所有期望,並且不要期待特定的呼叫。 OCMVerifyAll將驗證您對模擬對象所期望的一切。這不會導致測試失敗 - 兩個呼叫都會通過,因爲您已經第一次驗證了呼叫,因此對OCMVerifyAll()的呼叫將不會有任何驗證,因此它會通過。

最後,OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]);失敗,因爲您沒有設定期望值。

相關問題