如何在Objective-C单元测试中检查私有成员?

4

考虑这个类:

@interface SampleClass : NSObject {
    NSMutableArray *_childs;
}

- (void)addChild:(ChildClass *)child;
- (void)removeChild:(ChildClass *)child;

@end

当我添加一个子元素时,如何测试_childs数组是否包含一个对象,而不添加访问它的属性(因为我不想允许客户端代码访问_childs数组)?


1
Objective-C没有“私有成员”,它有实例变量。类似,但并不完全相同。 - bbum
抱歉,可能是剩余的C++词汇 ;) - Johnmph
你越快放弃C++的复杂性,拥抱Objective-C的简单性,你就越快能发布你的应用程序... :)(说真的,多年来我已经教过数百名开发者Objective-C,最困难的两个群体是假设ObjC工作方式相同的C++和Java程序员 - 不是说你正在这样做...只是一个观察)。 - bbum
3个回答

6
在类扩展中创建一个@property,并使用该属性进行所有访问,这样您在测试和使用相同的代码。

谢谢,这是我见过的最好的方法。 - Johnmph

1

我不确定我正确理解了你的问题,我的解析是:在实现addChild:时,如何防止将对象第二次插入到_childs中?

有两种方法:如果您的元素顺序不重要,则应该使用{{link1:NSMutableSet}}而不是NSMutableArray。在这种情况下,集合会处理一切:

- (void)addChild:(ChildClass *)child
{
    [_childs addObject:child];
}

如果顺序很重要,那么请使用NSMutableArray并按照以下方式进行操作:

is

- (void)addChild:(ChildClass *)child
{
    if ([_childs containsObject:child]) return;

    [_childs addObject:child];
}

这段代码只是一个例子,我想了解的是在单元测试中访问实例变量的概念,而不需要修改代码。 - Johnmph

0
只需创建一个 -(int)childCount 方法来返回数组的计数即可。

将该方法放在类扩展中。 - zaph
是的,但是用这种方式,我只需要修改我的类来进行测试,而不需要在客户端代码中使用childCount方法。 - Johnmph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接