Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Doing a compare of NSArray in ocUnit

I'm new to ocUnit and I'm attempting to compare 2 arrays with the STAssertTrue method and == for equality.

The test below simply asks the system under test (sut) for the array in return

- (void) testParse {
  SomeClassForTesting* sut = [[SomeClassForTesting alloc] init];
  NSArray* result = [sut parseAndReturn];

  NSArray* expected = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4",nil];

  STAssertTrue(result == expected, @"This test failed");
}

Then inside my production code I simply return the same array

- (NSArray *)parseAndReturn
{
  NSArray* x = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4",nil];
  return x;
}

Yet when the test runs I get a failure. How should I compare these objects to see if they are the same or not?

Thank you in advance

like image 591
Toran Billups Avatar asked Jan 30 '11 01:01

Toran Billups


3 Answers

There's a macro STAssertEqualObjects which uses -isEqual: for object comparison. I think it's exactly what you need.

STAssertTrue in your case compares object pointers and fails because result and expected are different objects (their pointers are different).

like image 77
Costique Avatar answered Nov 08 '22 23:11

Costique


You probably want something like:

STAssertTrue([result isEqual: expected], @"This test failed");

This will go through the arrays and return false if each item does not return true from its isEqual implementations. If your array members are NSStrings as is indicated, you should be good to go.

As the other fellow said, in Objective-C, == implies pointer equality and not value equivalence.

like image 2
ipmcc Avatar answered Nov 08 '22 23:11

ipmcc


What you are comparing is whether expected and result are pointing to the same array, which they obviously are not. Instead in order to compare the content you need to go through both the NSArrays and compare object by object using the object's compare function.

like image 1
AndersK Avatar answered Nov 08 '22 21:11

AndersK