我正在使用新的 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_WARN_UNDECLARED_SELECTOR
关闭,但这些是错误,而不是警告。当测试需要涵盖方法可能尚未实现(即使作为定义)的情况时,如何测试对象的 init 方法?
该方法可能尚未实现,因为我先编写测试;这是正确的,还是我应该先写我的类定义,然后是我的测试,然后是实际的实现?(我正在寻找关于这一点的共识和最佳实践,而不仅仅是意见。)