Как выполнить модульное тестирование местных локальных уведомлений - PullRequest
8 голосов
/ 23 мая 2019

Я только что добавил локальные уведомления в свое приложение.Эти уведомления должны запускаться только , если regionCode (т. Е. Locale.current.regionCode) приложения имеет значение "US" или "CA".Я не заинтересован в локали language.

. Я также хочу написать дополнительный тестовый пример, но как только я знаю, как написать один тестовый пример, другой будет следовать естественным образом..

Следовательно, мой вопрос: Как можно ввести локаль в тест (см. testSuccessfulNotificationDelivery())?

LocalNotificationTests.swift :

class LocalNotificationTests: XCTestCase {

    let notification1 = LocalNotification(toTriggerInSeconds: 5)
    let notification2 = LocalNotification(toTriggerInSeconds: 6)

    // This object manages LocalNotifications 
    // by building them into UNUserNotifications
    // and then scheduling them using UNUserNotificationCenter.
    let notificationManager = NotificationManager()

    func testSuccessfulNotificationDelivery() {

        // setup locale and use it for testing, somehow
        let ?? = Locale(identifier: "en_CA")

        // The answer to my question would go here. 
        // (Inject Locale into the test, somehow?)

        notificationManager.schedule(notifications: [notification1, notification2], 
                                     withRegionCode: ??.regionCode)

        let expectation = self.expectation(description: "notification delivery")

        var deliveredNotifications: [UNNotification]?

        UNUserNotificationCenter.current().getDeliveredNotifications {
            deliveredNotifications = $0
            expectation.fulfill()
        }

        waitForExpectations(timeout: 10, handler: nil)

        XCTAssertEqual(deliveredNotifications?.count, 2) 
    }
}

Примите значения по умолчанию setup() и tearDown().

Ответы [ 4 ]

1 голос
/ 31 мая 2019

Если вы редактируете свою схему и выбираете Test / Options, вы можете установить область приложения:
enter image description here Было бы достаточно иметь разные схемы для ручного тестирования?

Кроме того, если вы создаете бота, вы можете настроить конфигурацию сборки так, чтобы он выбирал определенный регион: enter image description here Если вы определяете разных ботов, вы можете запускать тесты автоматически.

0 голосов
/ 02 июня 2019
class LocalNotificationTests: XCTestCase {

let notification1 = LocalNotification(toTriggerInSeconds: 5)
let notification2 = LocalNotification(toTriggerInSeconds: 6)

// This object manages LocalNotifications 
// by building them into UNUserNotifications
// and then scheduling them using UNUserNotificationCenter.
let notificationManager = NotificationManager()

func testSuccessfulCanadaNotificationDelivery() {
    let canadaLocale = Locale("en_CA")
    XCTAssertTrue(notificationDelivered(with: canadaLocale))
}

func testNotificationDeliveryFailure() {
    let notCanadaOrUs = Locale("ru_RU")
    XCTAssertFalse(notificationDelivered(with: notCanadaOrUs))
}


private func notificationDelivered(with locale: Locale) -> Bool {

    // The answer to my question would go here. 
    // (Inject Locale into the test, somehow?)

    notificationManager.schedule(notifications: [notification1, notification2], 
                                 withRegionCode: locale.regionCode)

    let expectation = self.expectation(description: "notification delivery")

    var deliveredNotifications: [UNNotification]?

    UNUserNotificationCenter.current().getDeliveredNotifications {
        deliveredNotifications = $0
        expectation.fulfill()
    }

    waitForExpectations(timeout: 10, handler: nil)

    return (deliveredNotifications?.count ?? 0) == 2
}

Можете ли вы сделать что-то подобное?

0 голосов
/ 31 мая 2019

Я не уверен, что вы можете сделать это с "XCTest", но я уверен, что вы можете сделать это с "XCUITest". Вы, вероятно, можете сделать что-то вроде этого?

class CALocalNotificationTests: LocalNotificationTests {
    override func setUp() {
        super.setUp()

        let app = XCUIApplication()
        app.launchArguments = ["-AppleLocale", "en_CA"]
        app.launch()
    }

    func testSuccessfulNotificationDelivery() {
        testSuccessfulNotificationDelivery(with: Locale(identifier: "en_CA"))
    }
}

class LocalNotificationTests: XCTestCase {

    let notification1 = LocalNotification(toTriggerInSeconds: 5)
    let notification2 = LocalNotification(toTriggerInSeconds: 6)
//
//    // This object manages LocalNotifications
//    // by building them into UNUserNotifications
//    // and then scheduling them using UNUserNotificationCenter.
    let notificationManager = NotificationManager()

    func testSuccessfulNotificationDelivery(with locale: Locale) {

        notificationManager.schedule(notifications: [notification1, notification2],
                                     withRegionCode: locale.regionCode)

        let expectation = self.expectation(description: "notification delivery")

        var deliveredNotifications: [UNNotification]?

        UNUserNotificationCenter.current().getDeliveredNotifications {
            deliveredNotifications = $0
            expectation.fulfill()
        }

        waitForExpectations(timeout: 10, handler: nil)

        XCTAssertEqual(deliveredNotifications?.count, 2)
    }
}

Я думаю, что это довольно тривиально, но ключом является app.launchArguments = ["-AppleLocale", "en_CA"].

Вы можете создавать разные тестовые (под) классы для разных локалей.

0 голосов
/ 29 мая 2019

Это не может точно удовлетворить ваши потребности, но вы можете проверить это сообщение .

Кажется важным замечанием об изменении стиля местоположения в ваших тестовых примерах.

После того, как мы выполнили тест на симуляторе или устройстве, он может перенести тот же язык и локаль в следующий тестовый пример XCUI. Между тестовыми примерами нет возможности очистить содержимое симулятора, поэтому рекомендуется создать новую схему для каждой страны и региона

А также вы можете проверить Документация Apple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...