2017-01-10 12 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

いくつかのこと:

あなたがisValidPropWithError:に渡されるテストでを作成しNSErrorオブジェクトのアドレスを期待しているので、まず、OCMVerify([partialMockUtility isValidPropWithError:&error]が失敗しているが、MyClass +someMethodにあなたが異なるを作成していますNSErrorオブジェクトです。 2つの異なるオブジェクトのアドレスは同じではありません。この問題を解決するには

にご期待と検証の変更:

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

を、ちょうどパラメータの実際の値を無視し、あなたがの中にそれを作成しているので、(NSErrorポインタになるだろうことを期待してsomeMethodでは、メソッドを呼び出す前にどのような状態になるかわからない)。

第2に、すでに明示的に+isValidPropWithErrorを確認しているため、OCMVerifyAll(partialMockUtility)は何も確認しません。明示的にすべての期待値を検証するか、単にOCMVerifyAll(partialMockUtility)を使用して、すべての期待を検証し、特定の呼び出しを期待することを迷わせる必要があります。 OCMVerifyAllはあなたがそれを与えるモックオブジェクトに期待するものすべてを検証します。これはテスト失敗の原因にはなりません。両方の通話は合格します。初めて電話を確認したため、OCMVerifyAll()への通話は確認の必要がないため、合格となります。

最後に、OCMVerify([partialMockLogger log:LoggerLevelWarning message:[error localizedDescription] className:className]);は期待していないため失敗しています。

関連する問題