单元测试 WKNavigationDelegate 函数 swift

Posted

技术标签:

【中文标题】单元测试 WKNavigationDelegate 函数 swift【英文标题】:Unit testing WKNavigationDelegate functions swift 【发布时间】:2020-09-10 09:33:42 【问题描述】:

我有一个 UIViewController 实现了一些 WKNavigationDelegate 函数,我想对这些函数中的逻辑进行单元测试。这是一个例子:

func webView(_ webView: WKWebView,
             decidePolicyFor navigationAction: WKNavigationAction,
             decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 
    guard let url = navigationAction.request.url else 
        decisionHandler(.cancel)
        return
    

    if url.absoluteString != "https://my-approved-url" 
        decisionHandler(.cancel)
        return
    
    decisionHandler(.allow)

我希望我的单元测试能够确保基于 WKNavigationActionrequest.url 使用正确的 WKNavigationActionPolicy 调用 decisionHandler

但是,我不知道如何测试此功能。当我运行我的测试项目时,在 webview 上调用 .load() 不会触发委托函数。我也尝试过直接调用这个函数来测试它,但似乎无法实例化我自己的新WKNavigationAction(.request 是只读的)。

WKNavigationDelegate 函数中单元测试逻辑的正确方法是什么?

【问题讨论】:

这能回答你的问题吗? Unit testing WKNavigationDelegate functions 【参考方案1】:

您直接调用委托方法的第二种方法是更好的方法,因为您在单元测试中不依赖 WebKit 的任何行为。

无法实例化一个WKNavigationAction的问题可以通过子类化解决。创建一个MockNavigationAction,它会返回您测试所需的请求,如下所示:

final class MockNavigationAction: WKNavigationAction 
    var mockedRequest: URLRequest!
    override var request: URLRequest 
        return mockedRequest
    

然后在你的单元测试中直接调用委托方法:

func test_AllowsCorrectURL() 
    let sut = ViewController()
    let action = MockNavigationAction()
    action.mockedRequest = URLRequest(url: URL(string: "https://my-approved-url")!)
    let allowExpectation = expectation(description: "Allows action")
    sut.webView(WKWebView(), decidePolicyFor: action)  policy in
        XCTAssertEqual(policy, .allow)
        allowExpectation.fulfill()
    
    waitForExpectations(timeout: 1.0)

【讨论】:

以上是关于单元测试 WKNavigationDelegate 函数 swift的主要内容,如果未能解决你的问题,请参考以下文章

未调用 WKNavigationDelegate 方法

Swift & ObjC 桥 - 找不到“WKNavigationDelegate”的协议声明

多个 WKWebView 实例的独立 webView didFinish WKNavigationDelegate 方法

Django单元测试测试视图问题,怎么解决

.NET 单元测试的艺术&单元测试之道C#版

什么是单元测试?如何做好单元测试?