Работя върху модулни тестове, използвайки 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) модифициране на кода на приложението за поддръжка на тестове на единици.
Някой друг срещал ли е това и предлагал ли е по-добро решение?