Как юнит тестировать синглтон в obj-c? - PullRequest
1 голос
/ 17 апреля 2009

У меня есть одноэлементный класс, и я не могу модульно протестировать их код.

У меня есть тест как:

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

[db createDb];

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

Но работают только первыми. Когда выполняется второе, я всегда получаю «null» из метода initWithName. Когда я удаляю код поддержки Singleton, все работает как положено.

Я мог бы взломать тестирование (но я не знаю, как сейчас), но подумать, существует ли "попер" способ справиться с этим.

Синглтон находится здесь: http://code.google.com/p/chibiorm/source/browse/trunk/src/Db.m

Ответы [ 4 ]

3 голосов
/ 17 апреля 2009

Синглтоны сложны для юнит-тестирования и иногда являются результатом плохого дизайна.

Я бы порекомендовал подумать о том, нужен ли вам в первую очередь синглтон.

0 голосов
/ 26 ноября 2014

Парень здесь написал то, что я написал бы в качестве ответа, а именно: используйте категории, чтобы при необходимости предоставлять отличающиеся экземпляры от ваших одноэлементных методов.

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

Остальные парни, которые все понтифицируют свое мнение о том, что "одиночные игры плохи, хорошо", должны игнорироваться. Первое, что я сделал, когда переключился на цель c, это написал библиотеку iOC, которую я никогда не использовал, потому что понял, что цель c НЕ является java, поэтому, пожалуйста, не обращайте внимания на людей, которые говорят о догме java: это не всегда применимо к цель c.

0 голосов
/ 19 апреля 2009

Я думаю, что вы не должны возвращать ноль на втором выделении, а выдавать исключение. Если вы хотите использовать синглтон, вы не должны пытаться создать два:).

Однако, если я решу создать синглтон, мой класс будет выглядеть так:

@implementation MySingleton

static id _instance = nil;

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

Как видите, я не навязываю, чтобы никогда не было более одного экземпляра. Вместо этого я использую соглашение, чтобы получить экземпляр только с методом экземпляра.

0 голосов
/ 17 апреля 2009

Возможно, вы могли бы использовать Фабричный шаблон и создать фабрику, которая раздает только один экземпляр (фактически ваш синглтон). Тогда реализация не будет единичной, и вы можете протестировать ее по своему усмотрению.

Единственным недостатком является то, что вы не защищены языком для создания собственного экземпляра, если вы не получаете его с завода. В C ++ вы можете преодолеть это, сделав конструктор приватным, а также друзей фабричного и модульного тестирования. Я не уверен, имеет ли Objective-C подобную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...