Невозможно получить доступ к свойству подкласса UITableView - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь проверить, вызывается ли метод ReloadData () экземпляром UITableView при обновлении его источника данных.

Я создал подкласс UITableView с именем MockTableView. Он имеет bool с именем reloadDataGotCalled, который устанавливается в значение true, когда вызывается переопределенная функция reloadData (). Затем я пытаюсь получить доступ к этому свойству из моего тестового класса, чтобы проверить, является ли оно истинным.

Однако, когда я пытаюсь это сделать, компилятор выдает мне сообщение, что «Значение типа« UITableView »не имеет члена» reloadDataGotCalled'"

Я не уверен, почему это происходит, потому что, насколько я вижу, я установил, что это значение имеет тип' MockTableView ', который должен иметь этот член?

// ViewController, который содержит выход tableView, который я хочу проверить.

class ItemListViewController: UIViewController {

    let itemManager = ItemManager()

    @IBOutlet var tableView: UITableView!
    @IBOutlet var dataProvider: (UITableViewDataSource & UITableViewDelegate & ItemManagerSettable)!

    @IBAction func addItem(_ sender: UIBarButtonItem) {
        if let nextViewController = storyboard?.instantiateViewController(identifier: "InputViewController") as? InputViewController {
            nextViewController.itemManager = itemManager
            present(nextViewController, animated: true, completion: nil)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = dataProvider
        tableView.delegate = dataProvider
        dataProvider.itemManager = itemManager
    }

}

// Мой тестовый класс

class ItemListViewControllerTest: XCTestCase {

    var sut: ItemListViewController!

    override func setUp() {
        //Given
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(identifier: "ItemListViewController")
        sut = (viewController as! ItemListViewController)
        //When
        sut.loadViewIfNeeded()
        }

// Тест, в котором я пытаюсь назначитьsut.tableView to mockTableView

func test_TableView_IsReloadedWhenItemAddedToItemManger() {
        let mockTableView = MockTableView()
        sut.tableView = mockTableView
        let item = ToDoItem(title: "Foo")
        sut.itemManager.add(item)
        sut.beginAppearanceTransition(true, animated: true)
        sut.endAppearanceTransition()
        XCTAssertTrue(sut.tableView.reloadDataGotCalled) // <- this is where I'm getting the compiler message "Value of type 'UITableView' has no member 'reloadDataGotCalled'"
    }

}

// Мой подкласс mockTableView в расширении ItemListViewControllerTests

extension ItemListViewControllerTest {

    class MockTableView: UITableView {

        var reloadDataGotCalled = false

        override func reloadData() {
            super.reloadData()
            reloadDataGotCalled = true
        }
    }

}

Я ожидаю, что он должен скомпилироваться, а затем тест должен завершиться неудачей, потому чтоЯ еще не написал код, чтобы он прошел?

1 Ответ

0 голосов
/ 19 октября 2019

Вы определили tableView экземпляр в ItemListViewController как UITableView . Таким образом, вы не можете получить доступ к свойству MockTableView с этим экземпляром.

Вы можете получить доступ к свойствам родителя только от дочерних элементов, а не наоборот. Если вы все еще хотите получить доступ к свойству, вы можете попробовать что-то вроде приведенного ниже фрагмента.

XCTAssertTrue((sut.tableView as! MockTableView).reloadDataGotCalled)

Надеюсь, это поможет.

...