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

Kev*_*tre 12 iphone testing xcode cocoa-touch objective-c

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

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

// NSString+Inflections.m
@implementation NSString (Inflections)
- (NSString *)pluralize { return self; }
@end
Run Code Online (Sandbox Code Playgroud)

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

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

  NSString *actual = [test pluralize];

  STAssertEqualObjects(actual, expected, @"Whoops"); 
}
Run Code Online (Sandbox Code Playgroud)

但是,这会导致我的测试在'无法识别的选择器发送到实例'时崩溃(而不是失败).

如何测试库中的类别?

我已经压缩并上传了完整的项目在这里,如果我的描述是不够的.

Bil*_*ill 19

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

在测试目标的构建设置中,添加-ObjC到Linking/Other Linker Flags值.

有关实际发生此错误的原因的进一步说明,请参阅Apple Reference.


Joe*_*Joe 13

编辑:请务必看到有关单元测试未找到文件的答案

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

在XCode 4中

  1. 单击导航器顶部的"Poppy"
  2. 在"目标"下选择"PoppyTests"
  3. 转到构建阶段
  4. 展开编译源
  5. 单击+号,然后添加NSString + Inflections.m

然后你应该获得类似以下输出的东西

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

  • 谢谢.这解决了问题,但是PoppyTest目标确实将Poppy作为依赖项.我做了一些查找,发现它也可以通过添加`-all_load`作为PoppyTest目标的其他链接器标志(在Build Settings下)来修复.这样就不需要将所有源文件添加到两个目标. (3认同)
  • 比尔在下面的回答比这个要好得多.您不应手动将库的源文件添加到单元测试目标.每次你这样做,小猫都会哭.您应该将您的单元测试链接到您的库.每当你这样做,一只小猫微笑. (2认同)