ios – 如何测试需要设备特定信息的函数/计算属性?

前端之家收集整理的这篇文章主要介绍了ios – 如何测试需要设备特定信息的函数/计算属性?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个日历应用程序,我正在努力为使用用户设备上的日历的功能创建测试.该
calendar:EKCalendar变量取自users事件存储,因此当单元测试在XCode的模拟器上运行时,它们会因日历不存在而失败.使用我的个人设备工作,但我们的构建服务器上的测试将失败.

测试使用用户日历/事件存储的函数/计算属性的好方法是什么?

  1. ///Return the user's name. If this hasn't been saved extract their name from their Enterprise calendar and save it.
  2. static var name: String? {
  3. if let savedName = defaults.string(forKey: "name") {
  4. return savedName
  5. }
  6.  
  7. // calendar is a specific EKCalendar members of my company will have.
  8. guard let calendar = MeetingsFetcher().getUserEnterpriseCalendars().first,let parsedName = calendar.title.firstMatch(from: Regex.organizerNameFromEKCalendar) else {
  9. return nil
  10. }
  11. defaults.set(parsedName,forKey: "name")
  12. return parsedName
  13. }
  14.  
  15.  
  16. func getEnterpriseCalendars() -> [EKCalendar]{
  17. guard EKEventStore.authorizationStatus(for: .event) == .authorized else { return [EKCalendar]() }
  18. for calendar in MeetingsFetcher.eventStoreClass.calendars(for: .event) {
  19. if calendar.source.title.range(of: "IBM") != nil{
  20. return [calendar]
  21. }
  22. }
  23. return [EKCalendar]()
  24. }

忽略它返回一个数组,我不确定为什么会这样做:p

解决方法

因此,请澄清您在函数中实际需要测试的内容.

> MeetingsFetcher().getUserEnterpriseCalendar()
> calendar.title.firstMatch(来自:Regex.organizerNameFromEKCalendar)

我的假设是你想要测试它们.但是你提到的问题我认为实际测试你的getUserEnterpriseCalendar函数是否真的在模拟器上正常工作是不可能的,因为它不会在任何地方返回任何东西(除了你在你的构建服务器上创建脚本让模拟器订阅添加你的日历它)

但是我可以建议你模拟getUserEnterpriseCalendar函数,并在你的单元测试中假设getUserEnterpriseCalendar将在任何环境中返回正确的值.您可能需要输入计算属性才能运行,并将MeetingFetcher作为参数传递给它.

  1. // function modification
  2. static func name(from meetingFetcher: MeetingFetcher) -> String {
  3. if let savedName = defaults.string(forKey: "name") {
  4. return savedName
  5. }
  6.  
  7. // calendar is a specific EKCalendar members of my company will have.
  8. guard let calendar = meetingFetcher.getUserEnterpriseCalendar().first,forKey: "name")
  9. return parsedName
  10. }
  11.  
  12. // In testing code.
  13. func testOrganizationCalendar() {
  14.  
  15. class MockedMeetingFetcher: MeetingFetcher {
  16. override func getUserEnterpriseCalendars() -> [EKCalendar] {
  17. let calendar1 = EKCalendar()
  18. calendar1.title = "ExpectedToMatchRegexTitle"
  19. return [calendar1]
  20. }
  21. }
  22.  
  23. XCTestAssertEqual(YourClass.name(from: MockedMeetingFetcher()),"Hure!!!")
  24.  
  25. }

我希望它甚至能给你一些想法.

猜你在找的iOS相关文章