是否有可能通过KIF测试获得新的应用程序会话?

时间:2017-09-19 18:58:25

标签: ios swift caching urlsession kif-framework

我正在尝试编写一个测试,我的下一个测试应该有一个新的应用程序会话,这样我在之前的测试中所做的所有活动都被清除了。我想知道KIF是否可行?

2 个答案:

答案 0 :(得分:0)

这是不可能的,因为KIF是从分离的目标实例化的。此外,由于系统不允许,因此无法进行新的应用会话。

答案 1 :(得分:0)

我为这个答案做了很多研究,所以我不准确。谨慎使用这些建议:)

let request = NSMutableURLRequest(url: url!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60)

    let shared1 = URLSession.shared
    let shared2 = URLSession.shared
    let default1 = URLSession.init(configuration: .default)
    let default2 = URLSession.init(configuration: .default)
    print("shared1 session was \(shared1) urlCache: \(shared1.configuration.urlCache)")
    print("shared2 session was \(shared2) urlCache: \(shared2.configuration.urlCache)")
    print("default1 session was \(default1) urlCache: \(default1.configuration.urlCache)")
    print("default2 session was \(default2) urlCache: \(default2.configuration.urlCache)")

会打印:

shared1 session was <__NSURLSessionLocal: 0x7f976ac0fdd0> urlCache: Optional(<NSURLCache: 0x60400000fb20>)
shared2 session was <__NSURLSessionLocal: 0x7f976ac0fdd0> urlCache: Optional(<NSURLCache: 0x60400000fb20>)
default1 session was <__NSURLSessionLocal: 0x7f976ac10b50> urlCache: Optional(<NSURLCache: 0x60400000fb20>)
default2 session was <__NSURLSessionLocal: 0x7f976ac11170> urlCache: Optional(<NSURLCache: 0x60400000fb20>)

如您所见,shared会话将使用相同的引用,因此会使用相同的会话/缓存。

default它与众不同。 (我没有初始化我的共享会话。我只是设置指向它们的指针)。然而对于default,我创建了一个新指针!

据说默认会话的默认缓存也使用共享缓存!这意味着如果您创建2个不同的默认会话实例,那么他们不必下载图像两次!所以你还有问题!

  

对于默认会话,默认值为共享URL缓存   宾语。

     

Apple文档:urlCache

您可以做的是创建一个全新的urlCache并使用它进行更改。

let memoryCapacity = 50 * 1024 * 1024
let diskCapacity = 50 * 1024 * 1024
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache

每次需要新会话时都这样做。

URLCache.shared = cache部分将更改用于共享和默认会话的会话。

我能想到的其他一些选择:

使用ephemeral会话并在之后失效

使用短暂的会话:

确保您看到链接!

  

临时会话配置对象类似于默认值   会话配置对象,但相应的会话除外   对象不存储缓存,凭据存储或任何   与会话相关的数据到磁盘

let session = URLSession.init(configuration: .ephemeral)
session.invalidateAndCancel()

在测试结束时,也许在里面:afterAll,执行session.invalidateAndCancel(),这样:&#34;取消所有未完成的任务,然后使会话无效。&#34;

您也可以使用默认会话,然后使会话无效,但短暂会话可能会更好地满足您的需求。短暂有点像私人浏览。 (正如文档所说,你不能使共享会话无效,所以不要尝试使用它!)

我还没有使用过KIF,但我确实记得beforeAll有点儿错误。我不确定它的afterAll是否也是如此,所以确保它实际上被称为

使用reloadIgnoringLocalCacheData

这基本上意味着,对于此网址,请勿使用缓存数据!

let url = URL(string:"https://static.pexels.com/photos/132037/pexels-photo-132037.jpeg")
let request = NSMutableURLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 60)

对于大多数情况,你会.useProtocolCachePolicy作为你的cachePolicy,但不是这里!

使用useProtocolCachePolicy,只需符合到标题响应中获得的任何cachePolicy。如果将其设置为缓存5天,那么您将在本地缓存5天,直到再次发出实际的URL请求为止!

如果你使用.reloadIgnoringLocalCacheData那么它只会覆盖标题指定的任何缓存策略,并且总是再次从服务器请求。

如果我是你,我会为我的网络请求编写一个包装函数,并默认它们都使用这个.reloadIgnoringLocalCacheData cachePolicy。

将cacheSize设置为0

 let memoryCapacity = 0
 let diskCapacity = 0
 cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
 URLCache.shared = cache!

AFAIK此缓存大小会影响整个应用!我不确定您是否可以在应用程序中创建不同的缓存,或者为每个会话创建不同的缓存,这有点辜负了目的!

这样就没有任何好的缓存!

有关详情,请参阅herehere