MockUIAlertController lets you mock iOS alerts and action sheets for unit tests. It works for Swift as well as Objective-C.
(For old UIAlertView or UIActionSheet mocking, use MockUIAlertViewActionSheet.)
No actual alerts are presented. This means:
- The workflow doesn't pause for an action to be selected
- Tests are blazing fast.
For more discussion, see my blog post How to Test UIAlertControllers and Control Swizzling.
Nothing.
#import <MockUIAlertController/QCOMockAlertVerifier.h>
(or add it to your Swift test target's bridging header)- Instantiate a
QCOMockAlertVerifier
before the execution phase of the test. - Invoke the code to create and present your alert or action sheet.
Information about the alert or action sheet is then available through the QCOMockAlertVerifier.
For example, here's a test verifying the title. sut
is the system under test
in the test fixture.
- (void)testShowAlert_AlertShouldHaveTitle {
QCOMockAlertVerifier *alertVerifier = [[QCOMockAlertVerifier alloc] init];
[sut showAlert]; // Whatever triggers the alert
XCTAssertEqualObjects(alertVerifier.title, @"Title");
}
func testShowAlert_AlertShouldHaveTitle() {
let alertVerifier = QCOMockAlertVerifier()
sut.showAlert() // Whatever triggers the alert
XCTAssertEqual(alertVerifier.title, "Title")
}
To guard against tests which accidentally present real alerts, I recommend placing the alert verifier in the test fixture with setUp
/tearDown
.
Go through the steps above to present your alert or action sheet using QCOMockAlertController
.
Then call -executeActionForButtonWithTitle:
on your QCOMockAlertVerifier
with the button title.
For example:
- (void)testShowAlert_ExecutingActionForOKButton_ShouldDoSomething {
QCOMockAlertVerifier *alertVerifier = [[QCOMockAlertVerifier alloc] init];
[sut showAlert];
[alertVerifier executeActionForButtonWithTitle:@"OK"];
// Now assert what you want
}
func testShowAlert_ExecutingActionForOKButton_ShouldDoSomething() {
let alertVerifier = QCOMockAlertVerifier()
sut.showAlert()
alertVerifier.executeActionForButton(withTitle: "OK")
// Now assert what you want
}
See the sample apps. Run them on both phone & pad to see what they do, then read the ViewController tests.
Add the following to your Podfile, changing "MyTests" to the name of your test target:
target 'MyTests' do
inherit! :search_paths
pod 'MockUIAlertController', '~> 2.0'
end
Add the following to your Cartfile:
github "jonreid/MockUIAlertController" ~> 2.0
Make sure to take everything from Source/MockUIAlertController.