0

単体テストを学習しようとしています。以下は、サーバーから返された文字列を比較するための、初めて書いた単体テストです。インターネット接続の可用性と nsnotification を処理した方法が完全ではないことは確かです。テスト testGetURLEncodedString は、assert ステートメントがないため、常に pass を出力しました。応答を受信した後にサーバーから返された結果を比較する必要があるため、assert をそこに置くことはできません。誰でもこれを行う正しい方法を教えてください。

#import "MyAppTests.h"

@interface MyAppTests()
    @property(nonatomic) AppDelegate *delegate;
@end

@implementation MyAppTests

@synthesize delegate = _delegate;

- (void)setUp
{
    [super setUp];

    self.delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if(![self.delegate internetConnectionAvailable])
    {
      STFail(@"Internet is not reachable.");
      exit(-1);
    }
}

- (void)tearDown
{
    _delegate = nil;
     [super tearDown];
}

- (void)testDelegate
{
     STAssertNotNil(self.delegate, @"Cannot find the application delegate");
}

- (void)testGetURLEncodedString
{
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getURLEncodedStringSuccess:) name:@"getURLEncodedStringSuccess" object:nil];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getURLEncodedStringFailed:) name:@"getURLEncodedStringFailed" object:nil];

    [self.delegate getURLEncodedString:@"Testing Text"];
}

-(void)getURLEncodedStringSuccess:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringSuccess" object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringFailed" object:nil];

    STAssertTrue([[self.delegate getURLEncodedStringResponse] isEqualToString:@"Testing Text"], @"testGetURLEncodedString failed - did not receive expected response");
 }

-(void)getURLEncodedStringFailed:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringSuccess" object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringFailed" object:nil];

    STFail(@"testGetURLEncodedString failed - server failed returning result");
}
4

1 に答える 1

0

サーバーを呼び出して応答をチェックする自動テストは、サーバーの「受け入れテスト」と呼ばれる方が適切です。ただし、単体テストは非常に高速である必要があるため、アプリの単体テストターゲットとは別のターゲットに保持する必要があります。そして、それらを高速に保つ主な方法は、実際のネットワークを回避することです。そして、それは少し進歩しています。

OCUnitを使い始めたばかりなので、受け入れテストから始めないことをお勧めします。これは、通常、作成が難しく、フィードバックの精度が低くなるためです。代わりに、モデルロジックのテストである最も単純なテストから始めます。私のXcodeTDD101は、単体テストの仕組みを学ぶのに役立つかもしれません。

于 2012-08-16T05:51:24.933 に答える