Как проверить свойства класса, используя 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 автоматически заполняет селекторы для вас, и вы можете щелкнуть их по команде, чтобы перейти к их определениям.