2015-10-01 1 views
2

OHHTTPStubs не издеваются над запросами, если приложение iOS имеет свои собственные запросы?OHHTTPStubs не укорачивает хост?

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

  • OHHTTPStubs 4.3.0 with swift support
  • Alamofire 2.0.2

Test File - работает, как ожидалось

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

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

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

В последнем обновлении до 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

ответ

1

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

https://github.com/AliSoftware/OHHTTPStubs/issues/126 Разрешение в двух последних сообщений в нижней

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

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

И то, что я в конце концов сделал

Я сделал это так Alamofire запросы не при вводе в эксплуатацию

0

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

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

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

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

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

+0

Я открыл билет с OHHTTPStubs создателем и оказывается его краевой кейс между Alamofire и OHHTTPStubs https://github.com/AliSoftware/OHHTTPStubs/issues/126 резолюции перечислены в нижней части темы – wyu