U-L
U-L

Reputation: 2681

Test view title using XCTest

I am using XCtest to test the title of a view. Trying to get into the habit of writing tests first. Setup looks like

- (void)setUp
{
    [super setUp];
    self.appDelegate = [[UIApplication sharedApplication] delegate];
    self.tipViewController = self.appDelegate.tipViewController;
    self.tipView = self.tipViewController.view;

    self.settingsViewController = self.appDelegate.settingsViewController;
    self.settingsView = self.settingsViewController.view;
}

The problem is "settingsViewController". I have two functions for the actual test:

- (void) testTitleOfMainView{
    XCTAssertTrue([self.tipViewController.title isEqualToString:@"Tip Calculator"], @"The title should be Tip Calculator");
    //why does this not work?
    //    XCTAssertEqual(self.tipViewController.title, @"Tip Calculator", @"The title should be Tip Calculator");
}

- (void) testTitleOfSettingsView{
    //make the setttings view visible
    [self.tipViewController onSettingsButton];

    //test the title
    XCTAssertTrue([self.settingsViewController.title  isEqualToString:@"Settings"], @"The title should be Settings");
}

The "testTitleOfMainView" works. But the "testTitleOfSettingsView fails as self.settingsViewController is nil. I can sort of understand why. The view has not been initialized as yet. So I tried sending the message to the main controller that brings the settignscontroller in view

[self.tipViewController onSettingsButton];

The settingsController is still nil. Should I be using mocks? Somebody suggested this for my other question xctest - how to test if a new view loads on a button press

Should I subclass the settingsview and bring it up manually? Thank you.

Upvotes: 1

Views: 2170

Answers (1)

Jon Reid
Jon Reid

Reputation: 20980

Stay away from actually loading views in a real navigation stack. Real UI interactions typically need the run loop to receive events, so they will not work in a fast unit test. So throw away your setUp code.

Instead, instantiate the view controller on its own, and have it load:

- (void)testTitleOfSettingsView
{
    SettingsViewController *sut = [[SettingsViewController alloc] init];

    [sut view];    // Accessing the view causes it to load

    XCTAssertEquals(@"Settings", sut.title);
}

Also, learn the various assertions that are available to you in XCTest, not just XCAssertTrue. Avoid comments in those assertions; a single assertion in a small test should speak for itself.

Upvotes: 8

Related Questions