Как проверить свойства класса, используя TDD?

Почему когда я использую метод respondsToSelector: или же instancesRespondToSelector: в строке 43 я не могу обойти STAssertTrue?

// Мой код теста

- (void)testApiClass {
    //Check object
    NSString* classKey = @"Api";
    id obj = NSClassFromString(classKey);
    STAssertNotNil(obj, [NSString stringWithFormat:@"Model '%@' not found.", classKey]);
    //Check properties
    NSArray* properties =
    @[
        @"performSyncRequestWithUri::",
        @"performAsyncRequestWithUri:::",
    ];
    for (NSString* property in properties) {
        SEL propertySel = NSSelectorFromString(property);
        BOOL isRespondsToSel = [obj respondsToSelector:propertySel];
        STAssertTrue(isRespondsToSel, [NSString stringWithFormat:@"Property '%@' not found on object of class name '%@'", property, [obj class]]);
    }    
}


@interface Api : NSObject

- (NSDictionary*)performSyncRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params;
- (void)performAsyncRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params completionHandler:(void (^)(NSDictionary *, NSError *))completionBlock;

@end

2 ответа

Решение

Методы называются performAsyncRequestWithUri:params:completionHandler: а также performSyncRequestWithUri:params:

Строковые константы в вашем properties массив не совпадает с селекторами в вашем Api интерфейс.

Кроме того, ни один из этих селекторов не относится к свойству. Свойство имеет два селектора: геттер, как stringValue, который не имеет двоеточий, а сеттер, как setStringValue:, который имеет одну двоеточие и (обычно) начинается с set,

Вместо того, чтобы встраивать ваши селекторы в строки, создайте массив селекторов:

SEL selectors[] = {
    @selector(performSyncRequestWithUri:params:),
    @selector(performAsyncRequestWithUri:params:completionHandler:),
    NULL
};

for (size_t i = 0; selectors[i]; ++i) {
    SEL selector = selectors[i];
    BOOL respondsToSelector = [obj respondsToSelector:selector];
    STAssertTrue(respondsToSelector, [NSString stringWithFormat:
        @"Object %@ doesn't respond to selector %s",
        obj, sel_getName(selector)]);
}

Преимущества здесь в том, что XCode автоматически заполняет селекторы для вас, и вы можете щелкнуть их по команде, чтобы перейти к их определениям.

Другие вопросы по тегам