I\'m trying to unit test some iphone code that instantiates fonts. I\'ve narrowed it down to the following crashing unit test:
#import \"test.h\"
#import &l
Select your Unit Test target in the "Targets" section from the projects/targets list and under the "General" section choose your Host app as the main app, which has the fonts.
That solved the issue for me.
I'm seeing this exact problem with 3.2 (and 3.1.3). I've seen it in two separate machines, so I don't think that my SDK is broken.
I created a new iPhone view based project, and added a unit test, and one test case.
This is set up as a logic test.
Console output is as follows:
Test Case '-[TestTests testTests]' started.
/Developer/Tools/RunPlatformUnitTests.include: line 415: 21141 Trace/BPT trap "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Deve loper/usr/bin/otest' exited abnormally with code 133 (it may have crashed).
Command /bin/sh failed with exit code 1
If I set up the unit test for debugging, then I can see the crash, with the following stacktrace:
#0 0x00342d51 in __HALT
#1 0x002947c7 in _CFRuntimeCreateInstance
#2 0x00b8441e in GSFontCreateWithName
#3 0x028c8f31 in +[UIFont systemFontOfSize:]
I can see Kendall's point (UIKit stuff may only work on the device), but that doesn't seem to be documented very well anywhere.
Sorry for digging it up, but I have some issue with XCT test on Xcode 5 and it's related with this thread
Quote:
"Many UIKit classes won't work without the UIApplication Trying to add code to pass the tests in this project revealed that other tests would have to be conditionally excluded from LogicTests as well:
The default loadView method will fail — so the testLoadView method is #ifdef'd out.
Any attempt to alloc/init a UILabel will fail. I don't know why but because of this, all tests on the labels must be #ifdef'd.
Generally, don't expect anything from the UIKit framework to work in your Logic tests. Other frameworks will almost always work (in this application, the CoreLocation and Foundation frameworks work without issue).
Within UIKit, some elements will work — for example, UIWebView didn't have any issues in my testing. Exactly which user-interface objects will fail in the LogicTests bundle (without an actual running application) is never really clear until you try but these failures are why you still need to run the Application Tests to verify against — the Application Tests are a more authoritative result for anything in UIKit."
URL: http://www.cocoawithlove.com/2009/12/sample-iphone-application-with-complete.html
One of my friends was recently running into this, and I dug out the last project I successfully set this up on. The trick is to run any of your tests that involve UIFont in application tests, rather than unit tests. Here are a few things to make sure of when setting up your application test target:
$(BUILT_PRODUCTS_DIR)/Your Product Name.app/Your Product Name
Again
. Take note, it's .../Product.app/Product
- that is, there
is no .app in the final segment of the path. If you're curious to
see the file you're referring to, find your build product, right
click, select View Package Contents, then find the executable.$(BUNDLE_LOADER)
. Easy peasy.-framework SenTestingKit
.... hopefull this'll be enough to get you all going. It's not all cleanly documented in one place, and figuring out how to get both kinds of tests running took more time and pain than I'd like to admit.
It's strange that Apple seems to have pulled down their own doco on the matter. I wonder if there's another change coming...
Please hit me up if you have any additions to the above. It's not a complete guide to setting up Application testing, but the above are the undocumented stumbling blocks I ran into. FMI, I highly recommend this CocoaWithLove article.
It doesn't state it very well, but Apple's Testing Kit splits unit tests into two separate categories:
Logic Tests
These tests check the correct functionality of your code in a clean-room environment.
Application tests
These tests check the functionality of your code in a running application.
There appears to be a lot of UI related code that can't be run in the "Logic Test" case. More information about Logic Tests vs Application Tests here.
http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/UnitTesting/01-Unit-Test_Overview/overview.html
Have you tried it on the device? I seem to remember you can only include UIKit stuff in tests when running on the device, not against the simulator...