如何在testing运行时在Xcode UItesting中模拟networking请求?

我们为使用KIF编写的应用程序提供了一套UItesting,我希望将其转换为使用新的Xcode UItesting框架。

这个应用程序是一个Rest AI的客户端,我们目前正在使用NSURLProtocol为响应GET,POST,PUT等服务预定义的JSON文件而进行嘲讽。所有testing都是使用这些文件中的数据定义的,所以我想继续使用它们。 服务器上的相同端点在testing中的不同位置返回不同的数据,所以我不能在前面模拟它们,我需要能够在testing运行时调用一个方法来模拟服务器的下一个响应。

不幸的是,在Xcode UItesting中使用NSURLProtocol不会影响testing的应用程序,而且我只能看到通过启动参数或环境将数据发送到应用程序的方式,例如在此答案中 。 我需要在testing过程中的不同阶段嘲笑他们。 我怎样才能在testing过程中改变UItesting中的networking请求? 或者我怎样才能与正在testing的应用程序进行通信,以便我可以嘲笑请求本身?

我们已经在纯Swift中开发了一个embedded式HTTP服务器,可以在testing用例中使用简单的模拟响应处理程序运行HTTP服务器,然后通过像API_BASE_URL这样的环境variables将URL传递给目标应用程序。 我写了一篇关于如何去做的文章

用于iOS UItesting的embedded式Web服务器

基本上有两个库,一个是Embassy ,它是简单的asynchronousHTTP服务器。 另一个是大使 ,一个嘲笑API端点的简单Web框架。

我们一直面临着尝试从KIF迁移到UItesting的完全相同的问题。 为了克服UItesting在存根和嘲讽方面的局限性,我们通过使用在应用程序上实例化的Web服务器,在应用程序和testing代码之间build立了自定义链接。 testing代码将HTTP请求发送到应用程序,该应用程序可方便地转换为存根请求(OHHTPStub),NSUserDefault更新,上传/下载应用程序的项目。 当你需要检查特定的端点被调用时,甚至可以开始监视networking调用。 如果您觉得缺less某些东西,那么添加新的function应该相当简单。

使用库是非常简单的,请检查我们的github回购

你可以使用OHHTTPStubs来嘲笑他们,或者通过编写自己的存根。

简而言之,您应该使用NSURLSession子类来存根请求,并将存根NSURLSession插入到您的networking层。 launchEnvironment属性可能会将嘲讽的URL传递给testing。