gpt4 book ai didi

ios - 在单元测试中,我如何以编程方式关闭系统权限对话框?

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:57 25 4
gpt4 key购买 nike

我有一个单元测试,它调用CNContactStore() 上的方法,例如CNContactStore().execute(saveRequest)。因此弹出联系人权限对话框,如推送通知警报,但联系人权限对话框不会自动关闭。我知道如何使用 addUIInterruptionMonitor() 在 UI 测试中执行此操作,但不知道如何在单元测试 中执行此操作。

contact permissions alert

最佳答案

我会围绕 CNContactStore 创建一个包装器,然后在测试时使用模拟。

您并不是真的对测试 CNContactStore 感兴趣,您感兴趣的是测试您的代码是否与 CNContactStore 正确交互,对吗?

设置

我会开始创建协议(protocol)和类,以从您的“正常”代码库中提取联系人信息。

首先是一个 Contact 结构,用于保存稍后创建实际 CNContact 所需的属性

struct Contact {
//holds whichever properties you need to create a CNContact
}

然后是一个协议(protocol)来保存你想要执行的方法。这可以通过一个包含很多方法的协议(protocol)来完成,就像这样

protocol ContactsHolder {
func save(contact: Contact)
func add(contact: Contact)
func delete(contact: Contact)
func update(contact: Contact)
//Maybe more methods, the important thing is that you abstract yourself away from CNContactStore and other Contact kit classes
}

或者你可以创建一个 enum 来保存可能的选项

enum ContactsUpdateMethod {
case save(Contact)
case add(Contact)
case delete(Contact)
case update(Contact)
}

protocol ContactsHolder {
func execute(_ method: ContactsUpdateMethod)
}

在你的“真实”代码中

准备就绪后,您就可以创建实际的 ContactsHolder,然后在内部使用 CNContactStore 以及与该框架相关的所有内容。

例如(如果您选择带有“纯”保存 功能的版本)

class CNContactsHolder: ContactsHolder {
func save(contact: Contact) {
//1. create a `CNContact` from your `Contact`
//2. create a saveRequest
//3. execute: CNContactStore().execute(saveRequest)
}

....
}

然后您为需要使用CNContactStore 的类提供对您的新ContactsHolder 协议(protocol)的引用

所以在你的课上你有

let contactsHolder: ContactsHolder

然后你可以在你的init方法中传入它

init(contactsHolder: ContactsHolder = CNContactsHolder()) {
self.contactsHolder = contactsHolder
}

或者你可以将它声明为一个var然后给它一个默认值

所以代替:

let contactsHolder: ContactsHolder

你说:

var contactsHolder: ContactsHolder = CNContactsHolder()

重要的是当你需要测试的时候你可以把ContactsHolder从一个“真实的”CNContactsHolder变成一个mock

在你的测试代码中

为了对此进行测试,您创建了一个模拟:

struct MockContactsHolder: ContactsHolder {
var saveWasCalled = false
func save(contact: Contact) {
saveWasCalled = true
}
}

然后你在你的类中使用它而不是 CNContactsHolder

现在您应该能够测试自己的代码,而不会因为使用 CNContactStore 而被与您的代码无关的权限和内容打断。

免责声明:)

我没有用编译器运行上面的代码,所以可能有错别字。

此外,为了使其适合 CNContact(回调等),可能还缺少点点滴滴,但我希望您了解如何将它们分开。

最后...看起来工作量很大,但我认为将“特定于框架”的代码放到一个单独的帮助程序类中是有意义的,隐藏在协议(protocol)后面,这样您就可以将其换掉例如,每当您需要进行测试时,或者...如果您决定在以后摆脱 CNContact 并使用不同的框架。

希望对您有所帮助。

关于ios - 在单元测试中,我如何以编程方式关闭系统权限对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com