A Delegate Pattern Example With Unit Tests
protocol SwitchableTableViewCellDelegate: class {
func valueChanged(_ isOn: Bool)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: SwitchableTableViewCell.cellId, for: indexPath) as? SwitchableTableViewCell else { return UITableViewCell() }
cell.delegate = self
return cell
}
extension ViewController: SwitchableTableViewCellDelegate {
func valueChanged(_ isOn: Bool) {
titleLabel.text = "Switch isOn -> \(isOn)"
}
}
weak var delegate: SwitchableTableViewCellDelegate?
@IBAction func valueChangedSwitch(_ sender: UISwitch) {
delegate?.valueChanged(sender.isOn)
}
class MockSwitchableTableViewCellDelegate: SwitchableTableViewCellDelegate {
var valueChangedCallCount = 0
func valueChanged(_ isOn: Bool) {
valueChangedCallCount += 1
}
}
let mockDelegate = MockSwitchableTableViewCellDelegate()
cell.delegate = mockDelegate
func testSwitchableDelegate_whenValueChanged_isOn() {
// given
let mockDelegate = MockSwitchableTableViewCellDelegate()
cell.delegate = mockDelegate
// when
cell.switch.sendActions(for: .valueChanged)
// then
XCTAssertEqual(mockDelegate.valueChangedCallCount, 1)
}