Customer.io
  • Platform
  • Pricing
  • Resources
  • Company
  • Sign In
Request Demo
  • Features
  • Pricing
  • Customers
  • Docs

Request Demo Sign In
  • Documentation
    • Getting Started
    • Accounts & Workspaces
    • People
    • Segmentation
    • Campaigns & Workflows
    • Message Channels
    • Liquid & Personalization
    • Metrics
    • Data & Integrations
  • API
    • API Reference
    • Reporting Webhooks
    • Integration Libraries
  • SDK
    • iOS
    • Android
  • Release Notes
iOS
  • Get Started
  • Identify people
  • Track events
  • Push notifications
  • Rich push notifications
  • Test support
  • Changelog
    • Get Started
    • Identify people
    • Track events
    • Push notifications
    • Rich push notifications
    • Test support
    • Changelog
    • Get Started
    • Identify people
    • Track events
    • Push notifications
    • Rich push notifications
    • Test support
    • Changelog
    • In-app messages

60

Test support

The SDK makes it easy to write unit, integration, UI, or other types of automated tests in your code base. We designed our SDK with first-class support for automated testing, making it easy to inject dependencies and perform mocking in your code.

This page is part of an introductory series to help you get started with the essential features of our SDK. The highlighted step(s) below are covered on this page. Before you continue, make sure you've implemented previous features—i.e. you can't identify people before you initialize the SDK!

graph LR getting-started(Install SDK) -->B(Initialize SDK) B --> identify(identify people) identify -.-> track-events(Send events) identify -.-> push(Receive push) identify -.-> rich-push(Receive Rich Push) track-events --> test-support(Write tests) push --> test-support rich-push --> test-support identify -.-> in-app(Receive in-app) in-app --> test-support click getting-started href "/docs/sdk/ios/alpha/getting-started" click B href "/docs/sdk/ios/alpha/getting-started/#initialize-the-sdk" click identify href "/docs/sdk/ios/alpha/identify" click track-events href "/docs/sdk/ios/alpha/track-events/" click push href "/docs/sdk/ios/alpha/push" click rich-push href "/docs/sdk/ios/alpha/rich-push" click in-app href "/docs/sdk/ios/alpha/in-app" click test-support href "/docs/sdk/ios/alpha/test-support" style test-support fill:#B5FFEF,stroke:#007069

Dependency injection

Every SDK class inherits from a Swift protocol. Inherited protocols use a consistent naming convention: <NameOfClass>Instance. For example, the CustomerIO class inherits the protocol CustomerIOInstance.

If you want to inject a class in your project, it could look something like the example below.

import CioTracking

class ProfileRepository {
    
    private let cio: CustomerIOInstance

    init(cio: CustomerIOInstance) {
        self.cio = cio
    }

    // Now, you can call any of the `CustomerIO` class functions with `self.cio`!
    func loginUser(email: String, password: String, onComplete: @escaping (Result<Success, Error>) -> Void) {
        // Login the user to your system...

        // Then, identify the profile with Customer.io:
        self.cio.identify(identifier: email)
    }
}

// Inject an instance of the `Tracking` class to your class:
let cio = CustomerIO(...)
let repository = ProfileRepository(cio: cio)

Mocking

The Customer.io SDK comes bundled with mock classes ready for you to use. That’s right, we generated mocks for you!

Mock classes follow the naming convention: <NameOfClass>Mock. For example, mock the CustomerIO class with CustomerIOMock.

Here’s an example test class showing how you would test your ProfileRepository class.

import Foundation
import CioTracking
import XCTest

class ProfileRepositoryTest: XCTestCase {
    private var cioMock: CustomerIOMock!
    private var repository: ProfileRepository!

    override func setUp() {
        super.setUp()

        cioMock = CustomerIOMock() // Create a new instance of the mock in setUp() to reset the mock. 

        repository = ProfileRepository(cio: cioMock)
    }

    func test_loginUser() {
        // Now, call your function under test:
        repository.loginUser(...)

        // You can access many properties of the mock class to assert the behavior of the mock. 
        XCTAssertTrue(cioMock.mockCalled)
        XCTAssertEqual(cioMock.identifyBodyCallsCount, 1)
        XCTAssertEqual(cioMock.identifyBodyReceivedInvocations[0].identifier, expectedIdentifier) 
    }
}
Copied to clipboard!
      • Dependency injection
    • Mocking
Latest release
Stable
Is this page helpful?

How can we make it better?

We appreciate your feedback!


Product
  • Features
  • Customer Success
  • Professional Services
  • Pricing
  • Workflows
  • Ad Audience Sync
  • Watch a Demo Video
Resources
  • Documentation
  • Release Notes
  • Customer.io API
  • Getting Started Guide
  • Integrations Catalog
  • Data Export Methods
  • Security and Compliance
Industry
  • SaaS
  • EdTech
  • Two-Sided Marketplaces
  • FinTech
  • Internet of Things (IoT)
  • Subscription Box
  • Media Companies
Company
  • Blog
  • Support
  • Partners
  • Customers
  • About
  • Careers
  • Contact Us
  • Privacy Policy
  • Terms of Service
  • Status
  • © Peaberry Software, Inc.