如何在obj-c中单元测试单例?

时间:2009-04-16 23:46:36

标签: objective-c unit-testing

我有一个单例类,无法对其代码进行单元测试。

我的测试如下:

    Db *db = [[Db alloc] initWithName:@"sample.db"];

[db createDb];

STAssertEquals([db existDb],YES,@"The db is not created!");

但只有第一个工作。当第二个执行时,我总是从initWithName方法获得“null”。当我删除单例支持代码时,所有工作都按预期工作。

我可以破解测试(但我现在不知道如何)但是想知道是否存在一种处理此问题的“poper”方法。

单身人士位于:http://code.google.com/p/chibiorm/source/browse/trunk/src/Db.m

4 个答案:

答案 0 :(得分:3)

单身人士难以进行单元测试,有时是设计不良的结果。

我的建议是先考虑一下你是否真的需要一个单身人士。

答案 1 :(得分:0)

也许您可以使用Factory pattern并创建一个仅分发一个实例的工厂(实际上是您的单身人士)。然后实现不是单身,你可以将它单元测试到你的内容。

唯一的缺点是,如果您不从工厂检索它,则不受语言保护以创建您自己的实例。在C ++中,您可以通过使构造函数为私有,工厂和单元测试朋友来克服这个问题。我不确定Objective-C是否有类似的功能。

答案 2 :(得分:0)

我认为你不应该在第二个alloc上返回nil但是会引发异常。如果你想使用单身,你不应该尝试创建两个:)。

但是,如果我决定创建一个单例,我的类看起来像:

@implementation MySingleton

static id _instance = nil;

+ instance
{
    if (_instance == nil) {
        // alloc/init
        _instance = [[self alloc] init];
        …
    }
    return _instance;
}
…
@end

正如您所看到的,我没有强制执行,可能永远不会有多个实例。相反,我使用约定只使用实例方法获取实例。

答案 3 :(得分:0)

这里的人已经写了我要写的答案,就是使用类别来根据需要从你的单例方法中提供不同的实例。

http://twobitlabs.com/2011/02/mocking-singletons-with-ocmock/

上面的其他人都在为他们对单身人士的看法发表意见,这些都是糟糕的。' kay"应该被忽略。当我切换到目标c时,我做的第一件事是编写一个iOC库,我从未使用过,因为我意识到目标c不是java,所以请忽略那些关于java教条的人:它总是不会适用于目标c。