类别的无法识别的选择器SenTestCase

时间:2011-03-28 21:05:11

标签: iphone objective-c cocoa-touch xcode testing

我在XCode 4中使用单元测试创​​建了一个新的Cocoa Touch静态库项目并添加了一个类别:

// NSString+Inflections.h
@interface NSString (Inflections)
- (NSString *)pluralize;
@end

// NSString+Inflections.m
@implementation NSString (Inflections)
- (NSString *)pluralize { return self; }
@end

然后将相应的import语句添加到我的测试用例中并编写了以下测试:

- (void)testPluralize
{
  NSString *test = @"person";
  NSString *expected = @"people";

  NSString *actual = [test pluralize];

  STAssertEqualObjects(actual, expected, @"Whoops"); 
}

但是,这会导致我的测试崩溃(不会失败),并且'无法识别的选择器被发送到实例'。

如何测试库中的类别?

如果我的描述不充分,我已经压缩并上传了整个项目here

4 个答案:

答案 0 :(得分:19)

我自己正在寻找这个问题的答案,并且发现(我相信)一个更简单的解决方案,无论何时在项目中添加新的类别类时都不需要记住在Compile Sources列表中添加引用。

在测试目标的构建设置中,将-ObjC添加到“链接/其他链接器标志”值。

可以在Apple Reference找到有关此错误实际发生原因的进一步说明。

答案 1 :(得分:13)

修改:请务必查看关于单元测试未找到文件的this answer

+1用于上传项目。问题是您的测试目标在Build Phases中不包含NSString + Inflections.m。

在XCode 4中

  1. 点击导航器顶部的“Poppy”
  2. 在目标
  3. 下选择“PoppyTests”
  4. 转到Build Phases
  5. 展开编译源
  6. 单击+号,然后添加NSString + Inflections.m
  7. 然后您应该获得类似以下输出的内容

      

    TestSuite'/blahblah/PoppyTests.octest(Tests)'于2011-03-28 21:31:34 +0000完成。   执行1次测试,1次失败(0   意外)在0.000(0.002)秒

答案 2 :(得分:1)

我还可以确认将所需文件添加到Test项目的Build Phases> Compile Sources集合解决了这个问题。非常感谢!

然而,当我尝试使用-all_load方法时,我开始收到一堆错误,例如_CGSizeZero未定义为架构i386。事实证明,有些代码 - 比如我在其中一个类中使用CGSizeZero的代码 - 可以使第二种方法破解。

然而,一旦我用CGSizeMake(0,0)替换CGSizeZero,第二种方法也很有效。

答案 3 :(得分:0)

当我在Objective-c项目中工作时,我遇到了同样的情况。我做了以下步骤,但进展顺利。

1)选择项目并转到目标。

2)选择测试目标并添加-ObjC,如图中所示。

enter image description here

3)现在尝试运行XCTest单元。