OCMock для метода с аргументом и возвращает значение - PullRequest
3 голосов
/ 06 января 2010

У меня есть класс, основанный на NSUserDefaults, который я пытаюсь выполнить модульным тестированием, и я предоставляю NSUserDefaults как образец для моего тестового класса. При запуске теста выдается ошибка:

OCMockObject [NSUserDefaults]: неожиданный метод вызван: dictionaryForKey: @ "ответ"

Я пытаюсь смоделировать этот метод экземпляра класса 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

Есть предложения?

1 Ответ

5 голосов
/ 02 февраля 2010

Не уверен, что вы поняли это, но это, вероятно, связано с использованием заглушки с проверкой. Вы должны использовать проверку с ожиданием.

т.е.

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

В этом случае вы используете verify, чтобы подтвердить, что ваш метод действительно вызвал ожидаемый метод (dictionaryForKey :). Вы используете заглушку, чтобы позволить вашему методу вызывать данный метод для Mock Object, но вам не нужно проверять, что он был вызван.

...