异步服务调用的 TableView 单元测试

Posted

技术标签:

【中文标题】异步服务调用的 TableView 单元测试【英文标题】:TableView Unit Test on Asynchronous Service call 【发布时间】:2017-06-30 18:23:00 【问题描述】:

我正在为我的应用程序编写单元测试用例,该应用程序具有来自服务器的数据的 UITableView。除了numberOfRowsInSection,我已经为我的TableView 添加了测试用例。

我正在关注以下 UITableView 测试用例的链接: Xcode 5 test UITableview with XCTest Framework

谁能建议如何为numberOfRowsInSection编写一个测试用例,它显示来自异步服务调用的数据? 任何想法或示例都会非常有帮助。

【问题讨论】:

【参考方案1】:

您可以使用OHHTTPStubs 并使用 json 伪造您的数据。将带有面部数据的 json 文件添加到您的项目中(注意选择正确的目标)。然后使用下一个代码来测试数据:

import XCTest
import OHHTTPStubs

class TestSomeRequest: XCTestCase 

    // MARK: - Attributes
    fileprivate let endpoint = "yourendpoint"
    fileprivate let apiUrl = "yoururl"
    fileprivate let path = "yourpath"



// MARK: - Setup & Tear Down
extension TestSomeRequest 
    override func setUp() 
        super.setUp()
        stub(condition: isHost((URL(string: apiUrl)?.host)!) && isPath(path), response: _ in
            guard let path = OHPathForFile("TestDataJson.json", type(of: self)) else 
                preconditionFailure("Could Not Find Test File!")
            
            return OHHTTPStubsResponse(fileAtPath: path, statusCode: 200, headers: ["Content-Type": "application/json"])
        )
    

    override func tearDown() 
        super.tearDown()
        OHHTTPStubs.removeAllStubs()
    



// MARK: - Tests
extension TestSomeRequest 
    func testNumberOfRowsInSection() 
        let fetchExpectation = expectation(description: "Test Fetching")
        let viewController = YourViewController()
        YourDataManager.shared.fetchData(for: endpoint, success: 
            XCTAssertEqual(viewController.tableView.numberOfRows(inSection: 0), expectedNumberOfRows, "Number Of Rows In Section 0 Should Match!")
            fetchExpectation.fulfill()
        , failure: nil)
        waitForExpectations(timeout: 60, handler: nil)
    

如果您不想伪造数据,请使用此测试方法:

func testNumberOfRowsInSection() 
    let fetchExpectation = expectation(description: "Test Fetching")
    let viewController = YourViewController()
    YourDataManager.shared.fetchData(for: endpoint, success: 
        XCTAssertEqual(viewController.tableView.numberOfRows(inSection: 0), expectedNumberOfRows, "Number Of Rows In Section 0 Should Match!")
        fetchExpectation.fulfill()
    , failure: nil)
    waitForExpectations(timeout: 60, handler: nil)

【讨论】:

以上是关于异步服务调用的 TableView 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

单元测试基本框架和8个测试方面

单元测试基本框架和8个测试方面

使用 Moq 模拟单元测试的异步方法

在单元测试中同步调用异步方法是不是不正确?

单元测试集成测试

TDD:单元测试异步调用