I’m a big believer in testing, but not a very good practitioner. I’ve done pretty well at getting coverage on my model objects and programming them in a TDD style. I’m actually enjoying it so much I’d love to extend this to my controller layer, particularly my UIViewController subclasses.
Unfortunately, many UIKit classes don’t function in independent tests. However, I’m unhappy with the restriction of only running my dependent tests on the device. It’s really important to me to run all unit tests before every build, and it seems to me like its possible and worthwhile to unit test (as opposed to other types of testing) controller code.
My question is simply this: How do I test UIViewControllers in such a way that the tests run before every build? I am aware of a couple of different solutions to this problem, but don’t know a whole lot about the various benefits of each one.
So I was unhappy with this situation as it stood, and both Daniel and Ed’s answers spurred me on to improve things further. I decided to take matters into my own hands.
What I ended up writing was a small Cocoa Touch application that in -applicationDidFinishLaunching scans the class hierarchy for any SenTestCase subclasses and runs them. Unlike GoogleToolboxForMac’s unit testing stuff, I tried to use as much of the built in SenTesting machinery as possible and as a result it didn’t really end up as that much code. I haven’t done too much testing beyond verifying that UILabel allocates without crashing the test rig (otest does in fact crash if you try), but it should work.
I’ve put the source online on both Bitbucket and Github.