如何在Objective-C中对init方法进行单元测试?

如何在Objective-C中对init方法进行单元测试?,objective-c,xcode,unit-testing,xctest,Objective C,Xcode,Unit Testing,Xctest,我正在使用新的XCTest框架在Xcode 5中对Mac应用程序进行单元测试。具体地说,我试图测试一个类是否实现了一个(尚未编写!)-(id)initWithStream:(NSInputStream)stream方法。因此,我开始了我的测试: - (void)testInitWithStream { // Should have an init method named initWithStream: XCTAssertTrue([[MYParser alloc]

我正在使用新的XCTest框架在Xcode 5中对Mac应用程序进行单元测试。具体地说,我试图测试一个类是否实现了一个(尚未编写!)
-(id)initWithStream:(NSInputStream)stream
方法。因此,我开始了我的测试:

- (void)testInitWithStream
{
  // Should have an init method named initWithStream:
  XCTAssertTrue([[MYParser alloc]
                 respondsToSelector:@selector(initWithStream:)],
                @"'initWithStream:' not implemented.");
它工作得很好;测试目前按预期失败。这是下一部分,它试图运行尚未编写的方法,这让我感到悲伤:

  // Should return nil if no valid stream is passed
  XCTAssertNil([[MYParser alloc]
                  performSelector:@selector(initWithStream:)
                  withObject:nil], 
                 @"should get nil on 'initWithStream:' with no stream.");
Xcode告诉我错误“PerformSelector命名一个保留该对象的选择器”。我使用的是
PerformSelector:withObject:
,因为试图直接调用选择器会导致错误“没有可见的@interface for'MYParser'声明选择器'initWithStream:'

我的测试套件已关闭
GCC\u WARN\u UNDECLARED\u选择器
,但这些是错误,而不是警告。当测试需要涵盖方法可能尚未实现(甚至作为定义)的情况时,如何测试对象的init方法


该方法可能尚未实现,因为我正在首先编写测试;这是对的,还是应该先编写类定义,然后编写测试,然后编写实际实现?(我正在寻找关于这一点的共识和最佳实践,而不仅仅是意见。)

如果您正在进行测试优先开发,您不需要测试
respondsToSelector:@selector(initWithStream:)
。在测试套件中直接调用
initWithStream:
,首先不会编译。这是您在编写新代码之前应该修复的失败测试。你怎么修理它?通过实施该方法:

- (instancetype)initWithStream:(id)stream {
    return [super init];
}
您的测试现在可以编译了,这比以前好了一点。不过,运行测试将失败,因为很明显,实现并没有完成测试的目的。现在编写更多代码以使测试真正通过:

- (instancetype)initWithStream:(id)stream {
    if (!stream) {
        return nil;
    }
    return [super init];
}
接下来,您可以测试
stream
是否为
nil
,这将失败,因此您可以编写更多代码来修复它