Yesterday was katas day: the plan was to start the day with a simple one and then move to another a little more difficult. That was a good plan.
So I decided to do the Stack: a very simple kata, I just had to simulate a stack and have the following methods:
- (void) push: (id)object;
- (id)pop;
And for rules just this one: “stack should throw an exception if popped when empty.”
Simple right? I thought so too. And it was really easy to solve it: just create a NSMutableArray category and add the methods to NSMutableArray.
So I create I first test :
- (void)testShouldPushAnObjectTotheStack {
NSMutableArray *stack = [NSMutableArray array];
[stack push:@"Pushed an object"];
XCTAssertTrue([stack[0] isEqualToString:@"Pushed an object"]);
}
So I create my class and my code and everything builds! Great, just run the tests and that’s it! No it isn’t!!! Here’s the result of my test:
What? So the code builds and then I have this error:”unrecognized selector sent to instance”. Well let’s ask google….
In reality it took me all morning to figure it out! I must improve my search techniques!!! After googling a lot and a lot of frustration, I find a blog post that saved my day: So if you want to test a category you must add -all_load flag to your test project. Go to: YourTestTarget > Build Settings > Linking > Other Linker Flags.
Problem solved!
You can find my final solution here.