OHHTTPS тубы не заглушают хозяина?

OHHTTPS - не насмешливые запросы, если приложение iOS имеет свои собственные запросы?

Если приложение выполняет какой-либо запрос Alamofire до запуска тестов, OHHTTPStubs не будет насмехаться над запросами в модульных тестах.

  • OHHTTPStubs 4.3.0 with swift support
  • Alamofire 2.0.2

Тестовый файл - работает как положено

stub(isHost("httpbin.org")) { _ in
    let stubData = "Hello World!".dataUsingEncoding(NSUTF8StringEncoding)
    return OHHTTPStubsResponse(data: stubData!, statusCode:200, headers:nil)
}

print("@@Start")
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
    .responseString() { request, response, data in
        print(data)
}

Но как только вы добавляете следующее в AppDelegate.swift, оно больше не работает и вместо этого делает фактический HTTP-запрос к службе

Alamofire.request(.GET, "http://httpbin.org/get")
    .responseString() { request, response, data in
            print(data)
}

Оригинальный вопрос оставлен для потомков

Обновление: я попытался снова в чистом проекте, и он работал как ожидалось, поэтому должно быть что-то еще происходит.

В последнем обновлении до swift 2.0 OHHTTPStubs не заглушал запросы, а вместо этого они передавались и вызывались вживую.

Я создал короткий пример в модульном тесте, но он все еще проходит. Что мне не хватает?

import Foundation
import Quick
import Nimble
import Alamofire
import OHHTTPStubs

class RequestsSpec: QuickSpec {
var data:Result<String>? = nil

override func spec() {
    describe("the request") {
        it("needs to make a request") {

            stub(isHost("httpbin.org")) { _ in
                let stubData = "Hello World!".dataUsingEncoding(NSUTF8StringEncoding)
                return OHHTTPStubsResponse(data: stubData!, statusCode:200, headers:nil)
            }

            Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
                .responseString() { request, response, data in
                    print(request)
                    print(response)
                    print(data)
                    print(data.value)
                    self.data = data
            }
            expect(self.data).toEventuallyNot(beNil(), timeout: 3)
        }
    }
}

я получил

Optional(<NSMutableURLRequest: 0x7f91598e22e0> { URL: http://httpbin.org/get?foo=bar })
Optional(<NSHTTPURLResponse: 0x7f915da8c220> { URL: http://httpbin.org/get?foo=bar } { status code: 200, headers {
    "Access-Control-Allow-Credentials" = true;
    "Access-Control-Allow-Origin" = "*";
    Connection = "keep-alive";
    "Content-Length" = 364;
    "Content-Type" = "application/json";
    Date = "Thu, 01 Oct 2015 04:19:42 GMT";
    Server = nginx;
} })
Optional("{\n  \"args\": {\n    \"foo\": \"bar\"\n  }, \n  \"headers\": {\n    \"Accept\": \"*/*\", \n    \"Accept-Encoding\": \"gzip;q=1.0,compress;q=0.5\", \n    \"Accept-Language\": \"en-US;q=1.0\", \n    \"Host\": \"httpbin.org\", \n    \"User-Agent\": \"ios-consumer-app/com.dante.ouli2 (28; OS Version 9.0 (Build 13A340))\"\n  }, \n  \"url\": \"http://httpbin.org/get?foo=bar\"\n}\n")

Вместо Hello World!

Я попытался сделать запрос с NSURLSession и OHHTTPStubs работал правильно. Похоже, что-то не так с взаимодействием OHHTTPStubs/Alamofire?

            let url = NSURL(string: "http://httpbin.org/get")

            let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
                print(NSString(data: data!, encoding: NSUTF8StringEncoding))
                self.data2 = data
            }
  • OHHTTPStubs 4.3.0 с быстрой поддержкой
  • Alamofire 2.0.2

2 ответа

Решение

Открыл тикет с OHHTTPS тубами. Это грандиозный случай между Alamofire и OHHTTPStubs

https://github.com/AliSoftware/OHHTTPStubs/issues/126 Резолюция в двух последних постах внизу

Некоторые идеи, чтобы исправить ваш крайний случай:

  • Переключитесь на не размещенные тесты, чтобы приложение не запускалось до загрузки тестового пакета.
  • Сохраняйте размещенные тесты, но добавляйте OHHTTPStubs в ваш пакет приложений вместо вашего тестового пакета, чтобы он загружался, как только приложение запускается при выполнении ваших тестов
  • Каким-то образом взломайте код AppDelegate, чтобы при запуске из тестов он не вызывал Alamofire.request и чтобы первый запрос, сделанный Alamofire в приложении или в тесте (таким образом вызывал его вызов Manager.sharedInstance) это создает его внутреннюю NSURLSessionConfiguration) только после того, как тестовый пакет был загружен и внедрен в ваш пакет приложения.

И что я в конечном итоге сделал

Я сделал так, чтобы запросы Alamofire не делались во время запуска

Когда вы запускаете тесты Application/UI, Xcode запускает приложение в симуляторе, загружает тестовый пакет как своего рода плагин, а затем выполняет модульные тесты внутри приложения.

Фактическое приложение и тестовый комплект загружаются в память. Если вы связали OHHTTPStubs как с целью приложения, так и с целью тестирования, библиотека будет загружена дважды и в памяти будет загружено два экземпляра. Это приводит к тому, что заглушки в тестовом пакете не могут перехватить запрос внутри приложения.

По возможности избегайте привязки OHHTTPStubs к тестовой цели (вашему приложению), чтобы она загружалась только один раз.

Если вам действительно нужно иметь OHHTTPStubs внутри тестовой цели, вы можете добавить строку, которая действует как флаг для launchEnvironment во время настройки теста. Затем проверьте внутри своего приложения, существует ли флаг через NSProcessInfo.processInfo(). Environment["SOME_STRING_FLAG"].

Для получения дополнительной информации об этом прочитайте вики AliSoftware по этому вопросу: https://github.com/AliSoftware/OHHTTPStubs/wiki/A-tricky-case-with-Application-Tests

Другие вопросы по тегам