3

単体テストしようとしている NSUserDefaults に依存するクラスがあり、NSUserDefaults をモックとしてテスト クラスに提供しています。テストを実行すると、次のエラーが表示されます。

OCMockObject[NSUserDefaults]: 予期しないメソッドが呼び出されました: dictionaryForKey:@"response"

NSUserDefaults クラスのこのインスタンス メソッドをモックしようとしています。

- (NSDictionary *)dictionaryForKey:(NSString *)defaultName;

呼び出し形式を使用する:

[[[mockClass stub] andReturn:someDictionary] dictionaryForKey:@"aKey"]

DictionaryForKey メソッドを期待する必要があることをモックに伝えます。しかし、どういうわけか、これは記録されていないか、モックに「dictionaryForKey」呼び出しを期待することを知らなかったというエラーが表示されるため、期待するようにモックに伝えるのは正しくありません。

スタブの andReturn を呼び出す方法は、この質問と非常に似ているように見えますが、その質問では、ポスターは戻り値を取得していると述べています。私のテストケース:

-(void)testSomeWork
{
    id userDefaultsMock = [OCMockObject mockForClass:[NSUserDefaults class]];       
    MyClass *myClass = [[MyClass alloc] initWith:userDefaultsMock];

    NSDictionary *dictionary = [NSDictionary dictionary];

    [[[userDefaultsMock stub] andReturn:dictionary] dictionaryForKey:@"response"];

    BOOL result = [myClass doSomeWork];

    STAssertTrue(result, @"not working right");

    [myClass release];
    [userDefaultsMock verify];
}

私のクラス:

@implementation MyClass

@synthesize userDefaults;
- (id)initWith:(NSUserDefaults *aValue)
{
    if (self = [super init])
    {
        self.userDefaults = aValue;
    }
    return self;
}

- (BOOL)doSomeWork
{
    NSDictionary *response = [userDefaults dictionaryForKey:@"response"];

    if (response != nil)
    {
        // some stuff happens here
        return YES;
    }

    return NO;
}   
@end

助言がありますか?

4

1 に答える 1

5

これを理解したかどうかはわかりませんが、おそらく検証でスタブを使用することに関係しています。期待して確認を使用する必要があります。

すなわち

[[[userDefaultsMock expect] andReturn:dictionary] dictionaryForKey:@"response"];
...
[userDefaultsMock verify];

この例では、verify を使用して、メソッドが実際に期待されるメソッド (dictionaryForKey:) を呼び出したことを確認します。スタブを使用して、メソッドがモック オブジェクトの特定のメソッドを呼び出せるようにしますが、それが呼び出されたことを確認する必要はありません。

于 2010-02-02T13:45:34.587 に答える