ios - 为调用异步请求的函数编写单元测试并且不返回任何内容

标签 ios swift unit-testing

这是我的 ViewModel 调用,带有函数获取产品,我需要测试内部调用异步请求并设置一些数据的函数

class ViewModel : NSObject {
    public var array : [Product]?
    func fetchProduct() {
        ProductRouter.fetchByCategory.send(modelType: ProductSearchResponse.self, success: { (success) in
        self.array = (success as! ProductSearchResponse).skus
    }, fail: { (error : NSError) in
        print(error.localizedDescription)
    }, showHUD: true)
   }
}


class MyNetworkRequestTests: XCTestCase {
    func testExample() {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.

       let url = Bundle(for: type(of: self)).url(forResource: "Listing", withExtension: "json")!
       let data = try! Data(contentsOf: url)
       stub(uri(ProductRouter.fetchByCategory.path), jsonData(data))
       let vm = ViewModel()
       vm.fetchProduct()
       XCTAssertNotNil(vm.sku)              
  }
}
// Json File have some Listing.json have correct json format.

最佳答案

所以你要做的就是建立一个期望并等待它

class MyNetworkRequestTests: XCTestCase {
    func testExample() {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
       let expectation = expectation(description: "fetch expectation")
       let url = Bundle(for: type(of: self)).url(forResource: "Listing", withExtension: "json")!
       let data = try! Data(contentsOf: url)
       stub(uri(ProductRouter.fetchByCategory.path), jsonData(data))
       let vm = ViewModel()
       vm.fetchDone = {
            expectation.fullfill()
       }
       vm.fetchProduct()
       waitForExpectations(timeout: 10) { (error) in
             XCTAssertNotNil(vm.sku)
        }
  }
}

在这种情况下,“fetchDone”将告诉您的 viewController 数据已到达。基本上看起来像这样:

class vc: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let viewModel = vm()
        viewModel.fetchDone = {
            self.populate(array: viewModel.array)
        }
    }

    func populate(array: [String]) {

    }
}

class vm: NSObject {
    var fetchDone: (() ->())?
    var array: [String] = [] {
        didSet {
            fetchDone?()
        }
    }

    func fetchProduct() {
        // Do something
        self.array = ["some data"]
    }
}

关于ios - 为调用异步请求的函数编写单元测试并且不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57302897/

相关文章:

ios - UIView/UIViewController 右上角的页面 curl

ios - 实例方法 'mapView(_:didFailToLocateUserWithError:)'几乎符合可选要求

javascript - 使用 hubot-test-helper 和 jest 测试 Hubot

asp.net-mvc - 在对 Controller 操作进行单元测试时提供明确的 View 名称?

c# - 用于单元测试的虚拟 ObjectList 生成器

ios - 通知中心未在我的 obj c 类( utills 类或对象类)中触发。不是 View Controller

iOS模拟器连接超时

ios - UITableView 只显示 10 个单元格/行

ios - 如何不陷入 viewWillLayoutSubviews 的无限循环?

ios - 应用程序突然崩溃,错误显示 : attempt to recursively call -save: on the context in core data