blob: 45ba525186c9e86ca5ed9adcb5445e773eeeb018 [file] [log] [blame] [edit]
//
// RootViewControllerTests.m
// iPhoneExample
//
// Created by Erik Doernenburg on 20/07/10.
// Copyright 2010 Mulle Kybernetik. All rights reserved.
//
#import <OCMock/OCMock.h>
#import "RootViewControllerTests.h"
#import "RootViewController.h"
/*
A simple test suite to test the RootViewController. It needs to be run as an "application test" as described
in the following Apple document. This project is set up following the steps outlined in the document.
http://developer.apple.com/iphone/library/documentation/xcode/conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html
The first test could be run as a "logic test" but the second test invokes functionality that sets a cell
label, which requires instantiation of a font, and that is not possible outside the device/simulator. The
following discussion has a bit more detail:
http://stackoverflow.com/questions/1689586/why-does-instantiating-a-uifont-in-an-iphone-unit-test-cause-a-crash
As far as I am aware you cannot run the tests in the simulator; at least when I try to run the tests in the
simulator, the app just launches but there is no output in the debugger window that would indicate the tests
were run.
The first test should pass but the second test should fail, and you should be able to see something like the
following in your device log:
Test Suite '/var/mobile/Applications/4CEA4E8D-069E-4363-A4B5-E01AF01176CE/iPhoneExample.app/iPhoneExampleTests.octest(Tests)' started at 2010-07-28 10:33:45 +1000
Test Suite 'RootViewControllerTests' started at 2010-07-28 10:33:45 +1000
Test Case '-[RootViewControllerTests testControllerReturnsCorrectNumberOfRows]' passed (0.000 seconds).
Unknown.m:0: error: -[RootViewControllerTests testControllerSetsUpCellCorrectly] : OCMockObject[UITableView]: unexpected method invoked: dequeueReusableCellWithIdentifier:@"Cell"
expected: dequeueReusableCellWithIdentifier:@"HelloWorldCell"
Test Case '-[RootViewControllerTests testControllerSetsUpCellCorrectly]' failed (0.002 seconds).
Test Suite 'RootViewControllerTests' finished at 2010-07-28 10:33:45 +1000.
Executed 2 tests, with 1 failure (1 unexpected) in 0.002 (0.006) seconds
The failure occurs when then RootViewController sends the dequeueReusableCellWithIdentifier: method to the mock
table view. The mock view is set up to expect that method call with the string "HelloWorldCell" as an argument,
but the RootViewController calls the method with just "Cell" as an argument. When you change the identifier in
line 75 of the RootViewController to "HelloWorldCell" and re-run the tests, they should both pass.
*/
@implementation RootViewControllerTests
- (void)testControllerReturnsCorrectNumberOfRows
{
RootViewController *controller = [[[RootViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];
STAssertEquals(1, [controller tableView:nil numberOfRowsInSection:0], @"Should have returned correct number of rows.");
}
- (void)testControllerSetsUpCellCorrectly
{
RootViewController *controller = [[[RootViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];
id mockTableView = [OCMockObject mockForClass:[UITableView class]];
[[[mockTableView expect] andReturn:nil] dequeueReusableCellWithIdentifier:@"HelloWorldCell"];
UITableViewCell *cell = [controller tableView:mockTableView cellForRowAtIndexPath:nil];
STAssertNotNil(cell, @"Should have returned a cell");
STAssertEqualObjects(@"Hello World!", cell.textLabel.text, @"Should have set label");
[mockTableView verify];
}
@end