首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OHHTTPStubs没有顽固的主机?

OHHTTPStubs没有顽固的主机?
EN

Stack Overflow用户
提问于 2015-10-01 04:36:25
回答 2查看 2.9K关注 0票数 3

如果OHHTTPStubs应用程序有自己的请求,那么iOS不是在模拟请求吗?

如果应用程序在测试运行前执行任何Alamofire请求,OHHTTPStubs将不会在单元测试中模拟任何请求

  • OHHTTPStubs 4.3.0 with swift support
  • Alamofire 2.0.2

测试文件-按预期工作

代码语言:javascript
复制
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请求

代码语言:javascript
复制
Alamofire.request(.GET, "http://httpbin.org/get")
    .responseString() { request, response, data in
            print(data)
}

原始问题留给后人

更新:我在一个干净的项目中再次尝试,它按预期工作,所以肯定还有其他事情发生。

在最新一次升级到Web2.0的过程中,OHHTTPStubs并没有一直坚持这些请求,相反,它们被传递并被调用为live。

我在单元测试中建立了一个简短的例子,但它仍然在传递。我遗漏了什么?

代码语言:javascript
复制
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)
        }
    }
}

我得到了

代码语言:javascript
复制
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")

而不是“你好世界”!

我试着用NSURLSession和OHHTTPStubs使请求正常工作。看来OHHTTPStubs/Alamofire之间的互动有什么问题吗?

代码语言:javascript
复制
            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
  • 阿拉莫火2.0.2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-11 16:00:52

用OHHTTPStubs开了一张票。这是阿拉莫火和OHHTTPStubs之间的边缘情况

https://github.com/AliSoftware/OHHTTPStubs/issues/126分辨率位于最后两篇文章的底部。

解决你的边缘问题的一些想法:

  • 切换到非宿主测试,以便在加载测试包之前不会启动应用程序
  • 保留托管测试,但是将OHHTTPStubs添加到应用程序包中而不是测试包中,以便在运行测试时立即加载应用程序
  • 以某种方式黑掉您的AppDelegate代码,以便当从测试中启动时,它不会调用Alamofire.request,并且Alamofire在应用程序或测试中发出的第一个请求(从而触发它对创建其内部NSURLSessionConfiguration的Manager.sharedInstance的调用)只有在加载测试包并将其注入应用程序包之后才能完成。

我最终做了什么

我做到了,所以在启动过程中不会发出Alamofire请求

票数 1
EN

Stack Overflow用户

发布于 2015-11-09 12:58:22

运行Application/UI测试时,Xcode在模拟器中启动应用程序,将tests作为插件加载,然后在应用程序中执行Unit测试。

实际的App和都加载在内存中。如果您同时将OHHTTPStubs链接到instances和target,库将被加载两次,并在内存中加载两个实例。这会导致测试包中的存根无法拦截应用程序中的请求。

如果可能的话,避免将OHHTTPStubs链接到测试目标(您的应用程序),以便它只加载一次。

如果您确实需要在测试目标中包含OHHTTPStubs,则可以在测试设置期间向launchEnvironment追加一个字符串,该字符串的作用类似于一个标志。然后通过NSProcessInfo.processInfo().environment"SOME_STRING_FLAG".检查应用程序中是否存在该标志

有关此问题的更多信息,请阅读AliSoftware的wiki:https://github.com/AliSoftware/OHHTTPStubs/wiki/A-tricky-case-with-Application-Tests

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32879545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档