如何断言一个函数 returns 一个数组
How to assert that a function returns an array
我是第一次编写 iOS 单元测试,遇到了一些麻烦。当我在 PHP 中编写单元测试时,我还可以断言函数的返回值是——比方说——一个数组。
下面的代码有效,但这可能不是最好的方法,因为数组的内容可能会改变。
NSArray *first = [Example getArray];
NSArray *second = @[@"test", @"test2"];
XCTAssertEqualObjects(first, second, @"Example:getArray doesn't return an array.");
在 Objective-C 中执行此操作的正确方法是什么?
简单地说:
XTCAssert([first isKindOfClass:[NSArray class]], @"First isn't an array");
只需检查返回对象的 class,如下所示:
XCTAssertTrue([first isKindOfClass:[NSArray class]], @"Example:getArray doesn't return an array.");
你也可以检查array.count,或者它是否包含特定对象containsObject:方法。
要测试方法 returns 是否是特定的 class,您可以使用 isKindOfClass
来测试对象的类型。
XCTAssertTrue([first isKindOfClass:[NSArray class]], @"...");
如果您还想测试数组的内容,那么您有一些选择。
您可以对数组的内容进行排序,使两个数组的顺序相同。请参阅 this SO post 了解对数组进行排序的不同方法。
// let's say your arrays contains objects that have a name property
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sortedFirst = [first sortedArrayUsingDescriptors];
NSArray *sortedFirst = [first sortedArrayUsingDescriptors];
XCTAssertEqualObjects(sortedFirst, sortedSecond, @"...");
你可以用数组创建一个NSSet
。对于 NSSet
,相等性只会看集合中是否有相同的对象,而不是它们出现的顺序。这仅适用于永远不会包含重复对象的数组。如果从具有重复对象的数组创建集合,则集合中将只有这些对象的一个实例。
NSSet *firstSet = [NSSet setWithArray:first];
NSSet *secondSet = [NSSet setWithArray:second];
XCTAssertEqualObjects(firstSet, secondSet, @"...");
可以比较数组中对象的个数。这不是一个非常精细的测试,但它为您提供了比仅仅比较类型更精细的测试。
XCTAssertEqual(first.count, second.count, @"...");
我是第一次编写 iOS 单元测试,遇到了一些麻烦。当我在 PHP 中编写单元测试时,我还可以断言函数的返回值是——比方说——一个数组。
下面的代码有效,但这可能不是最好的方法,因为数组的内容可能会改变。
NSArray *first = [Example getArray];
NSArray *second = @[@"test", @"test2"];
XCTAssertEqualObjects(first, second, @"Example:getArray doesn't return an array.");
在 Objective-C 中执行此操作的正确方法是什么?
简单地说:
XTCAssert([first isKindOfClass:[NSArray class]], @"First isn't an array");
只需检查返回对象的 class,如下所示:
XCTAssertTrue([first isKindOfClass:[NSArray class]], @"Example:getArray doesn't return an array.");
你也可以检查array.count,或者它是否包含特定对象containsObject:方法。
要测试方法 returns 是否是特定的 class,您可以使用 isKindOfClass
来测试对象的类型。
XCTAssertTrue([first isKindOfClass:[NSArray class]], @"...");
如果您还想测试数组的内容,那么您有一些选择。
您可以对数组的内容进行排序,使两个数组的顺序相同。请参阅 this SO post 了解对数组进行排序的不同方法。
// let's say your arrays contains objects that have a name property NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; NSArray *sortedFirst = [first sortedArrayUsingDescriptors]; NSArray *sortedFirst = [first sortedArrayUsingDescriptors]; XCTAssertEqualObjects(sortedFirst, sortedSecond, @"...");
你可以用数组创建一个
NSSet
。对于NSSet
,相等性只会看集合中是否有相同的对象,而不是它们出现的顺序。这仅适用于永远不会包含重复对象的数组。如果从具有重复对象的数组创建集合,则集合中将只有这些对象的一个实例。NSSet *firstSet = [NSSet setWithArray:first]; NSSet *secondSet = [NSSet setWithArray:second]; XCTAssertEqualObjects(firstSet, secondSet, @"...");
可以比较数组中对象的个数。这不是一个非常精细的测试,但它为您提供了比仅仅比较类型更精细的测试。
XCTAssertEqual(first.count, second.count, @"...");