2

iOS アプリケーションに次のテスト ケースがあります。

-(void) testTwoDefaultUsersExist
{
NSString * expected;
NSString * actual;

expected = @"John Smith";
actual = [[[userService getAllUsers]objectAtIndex:0] fullName];
STAssertEqualObjects(expected, actual, @"Not equal");
expected = @"Dave Brown";
actual = [[[userService getAllUsers]objectAtIndex:1] fullName];
STAssertEqualObjects(expected, actual, @"Not equal");
}

上記は、 への呼び出し[userService getAllUsers]が 2 つの User オブジェクトを返すことを確認するだけです。1 つは John Smith という名前で、もう 1 つは Dave Brown です。これはこのシナリオではうまくいくように見えますが、その順序が変わる可能性がある他のケースがあるため、John は 0 ではなくインデックス 1 に配置される可能性があります

質問 :NSMutableArrayへの呼び出しから返される に、[userService getAllUsers]順序に関係なく、これらの 2 つのオブジェクトが含まれていると断言するにはどうすればよいですか?

4

3 に答える 3

1

単純に NSArray メソッドを使用することはできません-containsObject:か? NSMutableArray は依然として NSArray であるため、次のことができます。

NSArray * expected = [NSArray arrayWithObjects:@"John Smith", @"Dave Brown", nil];
NSArray * actual = [[userService getAllUsers] valueForKey:@"fullName"];
for(NSString * name in expected) {
    STAssertTrue([actual containsObject:name], @"Missing name");
}

-valueForKey:ユーザー オブジェクトの配列を NSString オブジェクトの配列に変換するための (ab) の使用に注意してください。これにより、-containsObject:呼び出しがより簡単になります。これは、ユーザー オブジェクトがプロパティのキー値コーディングに準拠している場合にのみ機能しfullNameます。

于 2012-06-25T14:27:37.363 に答える
0
  1. NSMutableArrayには、要素を配列に挿入するときに常に要素が含まれます

  2. 以下を使用して、挿入した要素を反復処理し、それらがNSArrayにあるかどうかをテストできます。

- (NSUInteger)indexOfObject:(id)anObject

オブジェクトが見つからない場合は、NSNotFoundを返します。これは、選択した単体テストフレームワークで使用できます。

ご挨拶

于 2012-06-25T13:56:41.003 に答える
0

このように等しいことを主張する

   NSAssert1([userService getAllUsers].count == 2, @"SomeDescription", nil);

いくつかの文字列の存在について配列を検索する場合は、次の関数を使用します

- (BOOL) containsAllNames:(NSArray*)arrToSearch namesToSearch:(NSArray*)arr
{    
    BOOL containsAll = YES;

    for (NSString *name in arr) {

        BOOL containsCurrent = NO;
        for (NSString *nameToSearch in arrToSearch) {
            if ([name isEqualToString:nameToSearch]) {
                containsCurrent = YES;
                break;
            }
        }

        if (!containsCurrent) {
            containsAll = NO;
        }
    }

    return containsAll;
}

のように呼びます

NSArray *toSearch = [NSArray arrayWithObjects:@"John Smith", @"Dave Brown", nil];
[self containsAllNames:YourArray namesToSearch:toSearch];
于 2012-06-25T13:56:47.933 に答える