Я работаю над модульными тестами, используя XCTest и OCMock 2.2.1. У меня есть класс, который получает идентификатор пакета, используя:
NSString *bundleIdentifier = [[NSBundle bundleForClass:[self class]] bundleIdentifier];
Это работает, как и ожидалось, при запуске приложения или модульных тестов для этого класса, в частности.
Работая с тестами на других классах, я частично имитирую этот объект, но все еще требую, чтобы метод, который получает идентификатор пакета, работал.
То, что я вижу, до передачи экземпляра объекта в + [OCMockObject partialMockForObject:]
выглядит правильно:
(lldb) po myObject
<MyObject: 0x1006ec480>
(lldb) po [NSBundle bundleForClass:[myObject class]]
NSBundle </Users/paynerc/Library/Developer/Xcode/DerivedData/xxxx/Build/Products/Debug/MyTests Tests.xctest> (loaded)
(lldb) po [[NSBundle bundleForClass:[myObject class]] bundleIdentifier]
com.paynerc.MyBundle
Однако после того, как я передам myObject
в [OCMockObject partialMockForObject:myObject]
, все изменится:
(lldb) po myObject
<MyObject-0x1006ec480-401894396.880136: 0x1006ec480>
(lldb) po [NSBundle bundleForClass:[myObject class]]
NSBundle </Applications/Xcode.app/Contents/Developer/usr/bin> (loaded)
(lldb) po [[NSBundle bundleForClass:[myObject class]] bundleIdentifier]
nil
Тот факт, что объект изменен и включает в себя частичную магию имитации, имеет смысл. Что кажется нелогичным, так это то, почему вызов bundleForClass
изменил то, что он возвращает.
Могу ли я что-нибудь сделать, чтобы bundleForClass
продолжал возвращать исходное значение, за исключением издевательских вызовов внутри MyObject? Беспокойство заключается в том, что любой, кому нужен частичный макет MyObject в другом модульном тесте, должен будет не забыть предоставить заглушенную реализацию bundleForClass
.
Мое текущее решение состоит в том, чтобы запросить идентификатор пакета и изучить результат. Если он равен нулю, я вызываю [NSBundle allBundles]
и перебираю их, пока не найду тот, который имеет ненулевой bundleIdentifier. Хотя в настоящее время это... работает... это A) не очень надежный B) ужасный метод грубой силы и C) изменение кода приложения для поддержки модульных тестов.
Кто-нибудь еще сталкивался с этим и придумал лучшее решение?