Objective c 如何在obj-c中进行单体单元测试?

Objective c 如何在obj-c中进行单体单元测试?,objective-c,unit-testing,Objective C,Unit Testing,我有一个单例类,不能对它们的代码进行单元测试 我的测试结果如下: Db *db = [[Db alloc] initWithName:@"sample.db"]; [db createDb]; STAssertEquals([db existDb],YES,@"The db is not created!"); 但只工作第一。当执行第二个时,我总是从initWithName方法获得“null”。当我删除单例支持代码时,所有代码都按预期工作 我可以破解测试(但我现在不知道怎么做),但

我有一个单例类,不能对它们的代码进行单元测试

我的测试结果如下:

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

[db createDb];

STAssertEquals([db existDb],YES,@"The db is not created!");
但只工作第一。当执行第二个时,我总是从initWithName方法获得“null”。当我删除单例支持代码时,所有代码都按预期工作

我可以破解测试(但我现在不知道怎么做),但想知道是否存在一种“流行”的方法来处理这个问题


单例位于此处:

单例很难进行单元测试,有时是设计不佳的结果

我的建议是首先仔细考虑你是否真的需要一个单身汉。

也许你可以使用并创建一个只提供一个实例的工厂(实际上是你的单身汉)。那么这个实现就不是一个单例,您可以根据自己的内心内容对它进行单元测试


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

我认为您不应该在第二个alloc中返回nil,而应该引发一个异常。如果要使用单例,则不应尝试创建两个:)

但是,如果我决定创建一个singleton,我的类将如下所示:

@implementation MySingleton

static id _instance = nil;

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

正如你所看到的,我并没有强制执行可能永远不会有一个以上的实例。相反,我使用约定仅使用实例方法获取实例。

这里的家伙写了我将要写的答案,即使用类别根据需要提供不同于单例方法的网络实例


上面的其他人都在高谈阔论他们对“单身是坏的m'kay”的看法,他们应该被忽略。当我切换到objective c时,我做的第一件事就是编写一个iOC库,我从未使用过它,因为我意识到objective c不是java,所以请不要理会那些喋喋不休谈论java教条的人:它并不总是适用于objective c。

如何在测试之外使用singleton?在我看来,您不应该在单例中执行[[Db alloc]init],而应该调用一个类方法来返回单个实例。。。那么,如何测试内部行为呢?您知道一个示例实现吗?我知道的工厂代码用于其他用途…它可能会。正如省略号所示,缺少了一些东西。我故意省略了它,因为我经常使用带有参数的init函数,如
initWithName:
。现在,在我看来,仔细考虑一下,您是对的,它应该站在那里,以显示实例已正确初始化。