Тесты OCUnit, дающие ошибки в классах, которые не тестируются - PullRequest
2 голосов
/ 17 марта 2011

Я написал тест OCUnit, который нормально работал в Xcode 3.2, и теперь у меня возникают проблемы с ним в Xcode 4. Он тестирует одну статическую функцию X в классе A, которая не вызываетлюбые классы или функции (за исключением библиотечных функций).Единственный другой код, который должен быть вызван, - это статический конструктор, который инициализирует две статические переменные, но, опять же, это жесткие значения (массивы), которые не вызывают никаких других классов, или функции класса A.

И все же мне пришлось включить файлы .m, .mm и .c для всех классов, которые он импортирует, которые они импортируют и т. Д., Чтобы решить _OBJC_CLASS _ $ _ ClassB ", на который делается ссылкаиз: ошибок. Я не помню, чтобы что-либо из этого делалось в Xcode 3, но хорошо, нет проблем, я получил его для компиляции. Теперь я получаю ошибки, происходящие из класса B 's +[B initialize].

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

Обновление

Чтобы понять, что происходит, я закомментировал все свои тесты и #import "A.h", чтобы посмотреть, что произойдет. Я добавил один простой модульный тест:

- (void) testSomething {
    STAssertTrue(NO, @"did it work?");
}

Все еще , мой +[B initialize] вызывается и выходит из строя.Кажется, что OCUnit просматривает все мои классы, и их +initialize методы вызываются в процессе.Это не имеет смысла для меня - как я могу отключить это поведение?

Вот трассировка стека до вызова моего собственного кода, в случае, если это помогает:

#7  _class_initialize ()
#8  prepareForMethodLookup ()
#9  lookUpMethod ()
#10 objc_msgSend ()
#11 +[NSObject(SenTestRuntimeUtilities) senIsASuperclassOfClass:] ()
#12 +[NSObject(SenTestRuntimeUtilities) senAllSubclasses] ()
#13 +[SenTestSuite updateCache] ()
#14 +[SenTestSuite suiteForBundleCache] ()
#15 +[SenTestSuite testSuiteForBundlePath:] ()
#16 +[SenTestProbe specifiedTestSuite] ()
#17 +[SenTestProbe runTests:] ()
#18 <????> ()
#19 <????> ()
#20 <????> ()
#21 <????> ()

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

У меня был ряд проблем с xcode 4, а также с наборами юнит-тестов.

Мне нужно было бы узнать ваш источник, чтобы узнать, что происходит в вашем случае, но OCUnit действительно делает многоразмышлять о занятиях.Вот так выясняется запускать методы, которые начинаются с «test».Таким образом, имеет некоторый смысл, что он проверяет ваши классы, вызывая их инициализаторы классов.

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

1 голос
/ 18 марта 2011

DougW прав, что я делаю вещи в своем методе + initialize, которого, вероятно, там быть не должно. В любом случае, я не был готов к рефакторингу, чтобы только мои модульные тесты могли выполняться.

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

+ (void)initialize
{
    if (NSClassFromString(@"SenTestSuite")) {
        NSLog(@"Not initializing 'B' class, because unit tests are running");
        return;
    }

    ...
}
...