带有 PACT 的 XCUITest 不返回模拟网络响应
Posted
技术标签:
【中文标题】带有 PACT 的 XCUITest 不返回模拟网络响应【英文标题】:XCUITest with PACT not Returning Mock Network Response 【发布时间】:2017-02-28 19:43:27 【问题描述】:我正在尝试使用PACT Consumer Swift 运行 XCUITest,无论我如何尝试配置它,都会发出真实的网络请求,而不是接收带有 200 状态代码和 X-Auth-Token 的模拟响应。我错过了什么?
这是 UI 测试用例:
import XCTest
import PactConsumerSwift
import Nimble
class MyFeature: XCTestCase
override func setUp()
super.setUp()
let app = XCUIApplication()
app.launchArguments = ["FeatureTest"]
app.launch()
Nimble.AsyncDefaults.Timeout = 60
override func tearDown()
super.tearDown()
func testSuccessfulSignIn()
let API = MockService(
provider: "Sign In API",
consumer: "Sign In Consumer")
API
.given("user signs in with valid credentials")
.uponReceiving("valid credentials")
.withRequest(method: .POST,
path: "/login",
body: [
"username": "john",
"password": "1234"
])
.willRespondWith(
status: 200,
headers: [
"X-Auth-Token":"Super-Cool-Token"
])
API.run (testComplete) in
let app = XCUIApplication()
let usernameField = app.textFields["UsernameField"]
usernameField.tap()
usernameField.tap()
usernameField.typeText("john")
let passwordField = app.secureTextFields["PasswordField"]
passwordField.tap()
passwordField.typeText("1234")
app.buttons["LOGIN"].tap()
expect(app.staticTexts["Welcome!"].exists).to(beTrue())
testComplete()
这是实际的登录逻辑:
func attemptLogin(_ user:String? = nil, password:String? = nil) -> Promise<LoginResponse>
if let
baseUrl = URLService.getBaseUrl(),
let url = URL(string: baseUrl + "login")
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
if
let username = encode(string: user),
let password = encode(string: password)
request.httpBody = "username=\(username)&password=\(password)".data(using: String.Encoding.utf8)
// Sends request and does other stuff...
【问题讨论】:
【参考方案1】:实例化 MockServer 类会在后台启动一个模拟服务器。它正在运行的 url 将在 MockServer 实例上可用。在您的示例中,这将是 API.baseUrl
您需要配置被测应用程序以与此 url 通信(即您希望 URLService.getBaseUrl()
返回模拟服务器的 url)。也许您可以通过启动参数或环境传递 url,例如app.launchArguments = ["FeatureTest", API.baseUrl]
【讨论】:
谢谢。那确实有帮助。我们有一个 xcconfig 文件,该文件已经具有运行模拟服务器的 baseUrl 和 UrlService 用来获取其基本 URL 的文件。现在我的挑战是让配置条件变量分配工作:-/以上是关于带有 PACT 的 XCUITest 不返回模拟网络响应的主要内容,如果未能解决你的问题,请参考以下文章
执行 XCUITest 时,Tap 方法在今日视图中不起作用
XCUItest addUIInterruptionMonitor 未在 iOS14 模拟器和 xcode 12 上捕获警报