新しい 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:
セレクターを直接呼び出そうとすると、「No visible @interface for 'MYParser' がセレクター 'initWithStream:' を宣言していません」というエラーが発生するため、使用しています。
テスト スイートがGCC_WARN_UNDECLARED_SELECTOR
オフになりましたが、これらはエラーであり、警告ではありません。メソッドが (定義としても) まだ実装されていない可能性がある状況をテストでカバーする必要がある場合、オブジェクトの init メソッドをテストするにはどうすればよいですか?
最初にテストを書いているので、メソッドはまだ実装されていない可能性があります。これは正しいですか、それとも最初にクラス定義を記述し、次にテストを記述し、次に実際の実装を記述する必要がありますか? (意見だけでなく、この点に関するコンセンサスとベストプラクティスを探しています。)