单元测试 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)
我希望我的单元测试能够确保基于 WKNavigationAction
的 request.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的主要内容,如果未能解决你的问题,请参考以下文章
Swift & ObjC 桥 - 找不到“WKNavigationDelegate”的协议声明
多个 WKWebView 实例的独立 webView didFinish WKNavigationDelegate 方法