XCUITest с PACT не возвращает фиктивный сетевой ответ

Я пытаюсь запустить XCUITest, используя PACT Consumer Swift, и как бы я ни пытался Настройте его, вместо получения фиктивного ответа с кодом состояния 200 и X-Auth-Token выполняется настоящий сетевой запрос. Что мне не хватает?

Вот пример теста пользовательского интерфейса:

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...
}

person Adam    schedule 28.02.2017    source источник


Ответы (1)


Создание экземпляра класса MockServer запускает фиктивный сервер в фоновом режиме. URL-адрес, на котором он запущен, будет доступен в экземпляре MockServer. В вашем примере это будет API.baseUrl

Вам необходимо настроить тестируемое приложение для взаимодействия с этим URL-адресом (т.е. вы хотите, чтобы URLService.getBaseUrl() возвращал URL-адрес фиктивного сервера). Возможно, вы можете передать URL-адрес через аргументы запуска или среду, например app.launchArguments = ["FeatureTest", API.baseUrl]

person Andrew Spinks    schedule 01.03.2017
comment
Спасибо. Это действительно помогло. У нас есть файл xcconfig, у которого уже есть baseUrl, под которым работает фиктивный сервер, и UrlService использует его для получения своего базового URL. Теперь моя задача - заставить работать условное присвоение переменных конфигурации: - / - person Adam; 01.03.2017