Objective c 如何使用TDD测试类的属性?

Objective c 如何使用TDD测试类的属性?,objective-c,tdd,respondstoselector,Objective C,Tdd,Respondstoselector,为什么在第43行使用方法respondsToSelector:或instancerespondstoselector:时无法绕过statsertTrue //我的测试用例代码 - (void)testApiClass { //Check object NSString* classKey = @"Api"; id obj = NSClassFromString(classKey); STAssertNotNil(obj, [NSString stringWithF

为什么在第43行使用方法
respondsToSelector:
instancerespondstoselector:
时无法绕过statsertTrue

//我的测试用例代码

- (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

这些方法被称为
performAsyncRequestWithUri:params:completionHandler:
performsynccrequestwithuri:params:
这些方法被称为
performAsyncRequestWithUri:params:completionHandler:
performsynccrequestwithuri:params:
属性中的字符串常量数组与
Api
界面中的选择器不匹配

而且,这两个选择器都不引用属性。属性有两个选择器:一个是没有冒号的getter,如
stringValue
;另一个是setter,如
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将为您自动完成选择器,您可以命令单击选择器跳转到它们的定义。

属性数组中的字符串常量与
Api
界面中的选择器不匹配

而且,这两个选择器都不引用属性。属性有两个选择器:一个是没有冒号的getter,如
stringValue
;另一个是setter,如
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将为您自动完成选择器,您可以命令单击选择器跳转到它们的定义。

“在第43行”没有行号“performSyncRequestWithUri::”“performSyncRequestWithUri:::”您真的有这样命名的方法吗?我对此深表怀疑。按照惯例,我们通常不使用空关键字创建方法。在本例中,第43行表示下一行:
BOOL isRespondsToSel=[obj respondsToSelector:propertySel]我真的有这个方法。你们可以在我的帖子下面找到接口(我有实现),这不是TDD。编写一个复杂的测试(使用for循环!)来证明一个对象符合它的接口有什么意义?Xcode将告诉您,无需测试。相反,为一项功能编写一个简单的小测试。“在第43行“没有行号”performSyncRequestWithUri::“performSyncRequestWithUri:::”您真的有这样命名的方法吗?我对此深表怀疑。按照惯例,我们通常不使用空关键字创建方法。在本例中,第43行表示下一行:
BOOL isRespondsToSel=[obj respondsToSelector:propertySel]我真的有这个方法。你们可以在我的帖子下面找到接口(我有实现),这不是TDD。编写一个复杂的测试(使用for循环!)来证明一个对象符合它的接口有什么意义?Xcode将告诉您,无需测试。相反,为一项功能编写一个简单的小测试。