iPhreaks is a podcast done as a panel discussion. The panel often brings strong experience from other platforms. (In fact, iPhreaks is the iOS cousin to the Ruby Rogues panel.) They already discussed TDD in episode 95. Following up on that, I'm honored that they invited me as their guest to talk more about TDD and Testing in episode 116.
iPhreaks Podcast Outline
Here's the outline of our discussion:
- Tools For Testing and Test-Driven Development (TDD)
- Getting Started with OCHamcrest
- Partial Matching
- Mocking and Stubbing
- TDD Process and Workflow
- TDD vs Unit Testing
- iOS Code That Doesn’t/Does Adapt Well to TDD
- User Interface Testing
- End-to-End Testing
- Communication and Collaboration
- OCMock, OCMockito
- OCMockito with Swift?
- Inside-Out vs. Outside-In
Things I Wish I'd Said
Of course, listening to the podcast, I realize there are things I wish I'd said, such as:
- The difference between mocks and stubs.
- That the purpose of mocks is to verify interactions.
- That you don't need a mocking framework to make mocks and stubs. In fact, I recommend against it at first.
So let’s say that you wanted to add a feature to Skype where, every time somebody typed the word “whistle” their phone would whistle at them. How would you TDD something like that?
Here's how I'd begin to break it down:
- Text detection to create a Whistle command.
- Executing the Whistle command, which plays a sound.
- What if the user pastes text instead of typing it, and it contains multiple commands?
It's challenging to take a workflow and break it down into smaller tests. Software design principles help a lot. In particular, don't embed control into your UI. Instead, design a UI-ignorant command architecture.
Don't embed control into your UI. Instead, design a UI-ignorant command architecture.