İçeriğe geç

Unit Test ve Dependency Injection

Merhabalar bu yazımda iOS ile Unit Test yaparken Dependency Injection tasarım prensibine sahip sınıf yapısını nasıl kullanacağımızı göreceğiz.

Önceki yazılarımda bahsettiğim işlevsel,modüler ve test işlemi için en çok kullanılan tasarım prensiplerinin başında gelen Dependency Injection yapısını kullanacağız.

Bu yapıyı kullanarak basit bir test işlemi gerçekleştirmemiz için, Aşağıdaki sınıfları inceleyelim.

import Foundation


protocol Social {
    var key:String {get set}
    var secretKey:String {get set}
    var isAuth:Bool? {get set}
    func getTimeline(uid: String) -> [String: Any]?
    func getUserDatas(uid: String) -> [String: Any]?
}

class FacebookManager: Social {
    
    var key: String
    var secretKey: String
    var isAuth: Bool?
    
    init(key: String, secretKey: String) {
        self.key = key
        self.secretKey = secretKey
    }
    
    func getTimeline(uid:String) -> [String: Any]? {
        guard let auth = isAuth else {
            return nil
        }
        
        return auth == true ? ["Sucess Facebook": true] : ["Fail Facebook": false]
    }
    
    func getUserDatas(uid:String) -> [String:Any]? {
        guard let auth = isAuth else {
            return nil
        }
        
        return auth == true ? ["*": 1] : ["*": 0]
    }
}

class TwitterManager: Social {
    
    var key: String
    var secretKey: String
    var isAuth: Bool?
    
    init(key: String, secretKey: String) {
        self.key = key
        self.secretKey = secretKey
    }
    
    func getTimeline(uid:String) -> [String: Any]? {
        guard let auth = isAuth else {
            return nil
        }
        
        return auth == true ? ["Sucess Twitter": true] : ["Fail Twitter": false]
    }
    
    func getUserDatas(uid:String) -> [String:Any]? {
        guard let auth = isAuth else {
            return nil
        }
        
        return auth == true ? ["*": 1] : ["*": 0]
    }
}

class SocialManager {
    
    private var platform:Social
    
    init(_ platform: Social) {
        self.platform = platform
    }
    
    func login() {
        platform.isAuth = true
    }
    
    func logout() {
        platform.isAuth = false
    }
    
    func getTimeline(uid:String) -> [String: Any]? {
        return platform.getTimeline(uid: uid)
    }
    
    func getUserDatas(uid:String) -> [String: Any]? {
        return platform.getUserDatas(uid: uid)
    }
}

Koda bakacak olursanız oldukça basit bir yapının olduğunu görebilirsiniz. Ortak fonksiyonları olan ancak ayrı işlemlerin yapılacağı Twitter ve Facebook sosyal medya sınıflarını yöneten bunları inject işlemi ile alıp kullanan Manager sınıfını kullanıyoruz.

Buradaki test işlemimiz login işlemi sonucu data response oluyor mu yoksa nil mi dönüyor ? sorusunu cevaplandırmak.

Bunun için aşağıdaki Test Case yazarak işlemimizi test ediyoruz.

import XCTest
import Foundation
@testable import The_I_OS_Tests

class ioTestCase: XCTestCase {
    
    var twManager:TwitterManager!
    var faceManager:FacebookManager!
    var manager:SocialManager!
    
    override func setUp() {
        super.setUp()
        twManager = TwitterManager(key: "000xTw", secretKey: "111xTw")
        faceManager = FacebookManager(key: "000xFace", secretKey: "111xFace")
    }
    
    override func tearDown() {
        super.tearDown()
        twManager = nil
        faceManager = nil
        manager = nil
    }
    
    func testManagerCase() { // * Test Success
        
        manager = SocialManager(faceManager)
        manager.login()
        let data = manager.getUserDatas(uid: "...")
        
        XCTAssertNotNil(data)
    }
}

Buradaki setUp ve tearDown fonksiyonlarının nerden çıktığını merak edebilirsiniz. Bu fonksiyonlar XCTestCase sınıfı içerisinde bulunmakta. Sınıf init işlemlerinde setUp,  değişken adres boşaltma işleminde ise tearDown fonksiyonu işinizi görecektir.

Tarih:Unit Test

Bu yazı yorumlara kapalı.

Copyright © 2021 Kenan Atmaca