如何测试需要特定信息的功能/计算属性



我正在开发一个日历应用程序,我正在努力为利用用户设备上日历的功能创建测试。这 calendar: EKCalendar变量是从用户事件存储中获取的,因此当单元测试在Xcode的仿真器上运行时,由于日历不存在,因此失败了。使用我的个人设备有效,但是测试将在我们的构建服务器上失败。

测试使用用户日历/事件店的功能/计算属性的好方法?

    ///Return the user's name. If this hasn't been saved extract their name from their Enterprise calendar and save it.
static var name: String? {
    if let savedName = defaults.string(forKey: "name") {
        return savedName
    }
    // calendar is a specific EKCalendar members of my company will have.
    guard let calendar = MeetingsFetcher().getUserEnterpriseCalendars().first,
        let parsedName = calendar.title.firstMatch(from: Regex.organizerNameFromEKCalendar) else {
            return nil
    }
    defaults.set(parsedName, forKey: "name")
    return parsedName
}

func getEnterpriseCalendars() -> [EKCalendar]{
    guard EKEventStore.authorizationStatus(for: .event) == .authorized else { return [EKCalendar]() }
    for calendar in MeetingsFetcher.eventStoreClass.calendars(for: .event) {
        if calendar.source.title.range(of: "IBM") != nil{
            return [calendar]
        }
    }
    return [EKCalendar]()
}

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

,请澄清一下您在功能中实际测试的内容。

  1. MeetingsFetcher().getUserEnterpriseCalendar()

  2. calendar.title.firstMatch(from: Regex.organizerNameFromEKCalendar)

我的假设是您想测试它们两个。但是,当您提到的问题时,我认为不可能实际测试您的getUserEnterpriseCalendar函数是否实际上在模拟器上工作正常,因为它不会返回任何地方>(除了您在构建服务器上创建脚本以允许模拟器订阅或添加脚本您的日历(

但是,我可以建议您模拟getUserEnterpriseCalendar功能,并在单元测试中做出一个假设,即getUserEnterpriseCalendar将在任何环境中返回正确的值。您可能需要掌握计算的属性才能功能并将MeetingFetcher作为此参数。

// function modification
static func name(from meetingFetcher: MeetingFetcher) -> String {
    if let savedName = defaults.string(forKey: "name") {
        return savedName
    }
    // calendar is a specific EKCalendar members of my company will have.
    guard let calendar = meetingFetcher.getUserEnterpriseCalendar().first,
        let parsedName = calendar.title.firstMatch(from: Regex.organizerNameFromEKCalendar) else {
            return nil
    }
    defaults.set(parsedName, forKey: "name")
    return parsedName
}
// In testing code.
func testOrganizationCalendar() {
    class MockedMeetingFetcher: MeetingFetcher {
        override func getUserEnterpriseCalendars() -> [EKCalendar] {
            let calendar1 = EKCalendar()
            calendar1.title = "ExpectedToMatchRegexTitle"
            return [calendar1]
        }
    }
    XCTestAssertEqual(YourClass.name(from: MockedMeetingFetcher()), "Hure!!!")
}

我希望它甚至可以帮助您一些想法。

最新更新