3

新しい 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 メソッドをテストするにはどうすればよいですか?

最初にテストを書いているので、メソッドはまだ実装されていない可能性があります。これは正しいですか、それとも最初にクラス定義を記述し、次にテストを記述し、次に実際の実装を記述する必要がありますか? (意見だけでなく、この点に関するコンセンサスとベストプラクティスを探しています。)

4

1 に答える 1

5

テスト ファーストの開発を行っている場合は、テストする必要はありませんrespondsToSelector:@selector(initWithStream:)。テスト スイートを直接呼び出すinitWithStream:と、最初はコンパイルされません。これは、新しいコードを記述する前に修正する必要がある失敗したテストです。どのように修正しますか?メソッドを実装することにより:

- (instancetype)initWithStream:(id)stream {
    return [super init];
}

テストがコンパイルされるようになり、以前よりも少し改善されました。ただし、テストの実行は失敗します。これは、明らかに実装がテストしていることを実行しないためです。次に、テストを実際にパスさせるためのコードをさらに記述します。

- (instancetype)initWithStream:(id)stream {
    if (!stream) {
        return nil;
    }
    return [super init];
}

次に、 でないことをテストできますがstreamnilこれは失敗するため、修正するコードをさらに記述します。

于 2013-10-30T00:46:08.613 に答える