Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

part5 (ch6). KeywordNews XCTest ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/ํŒจ์บ (์ดˆ๊ฒฉ์ฐจ)

part5 (ch6). KeywordNews XCTest ์ฝ”๋“œ๋ฆฌ๋ทฐ

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 2. 17. 02:23

โœ… ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋Š” ์–ธ์ œ๋‚˜ ํฌ์ŠคํŒ…๊ณผ ํ•จ๊ป˜ํ•œ๋‹ค.

์ด ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ณผ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š๊ณ  ๋‚˜ ํ˜ผ์ž ์“ฐ๋Š” ๋ง์ด๋ผ์„œ ๋” ํŽธํ•œ๋ฐ ๊ณง ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ์— ์ผ์ƒ์ด๋‚˜ ๋‹ด์•„๋ด์•ผ๊ฒ ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ๊ฑฐ ์™œ์“ฐ๋ƒ๋ฉด ๋‚ด๊ฐ€ ๊นƒํ—ˆ๋ธŒ์— ํŒŒ์ผ ๋”ฐ๋กœ ์˜ฌ๋ ค ์ •๋ฆฌํ•˜๋Š”๊ฒŒ ๋‚˜ํ•œํ…Œ๋Š” ์ข‹์€ ํ•™์Šต์œผ๋กœ ๋‹ค๊ฐ€์˜ค์ง€ ์•Š์•„์„œ, ๋ธ”๋กœ๊ทธ์— ๊ธ€์„ ์˜ฌ๋ฆฌ๋ฉด์„œ ๋‹ค์‹œ ๋ณด๋Š”๊ฒŒ ๋”์šฑ ์ข‹๋”๋ผ

 

 

โœ… ํŒŒ์ผ์˜ ๊ตฌ์กฐ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํŒŒ์ผ์˜ ๊ตฌ์กฐ

 

โœ… ๋งŒ๋‚ฌ๋˜ ๋ฌธ์ œ ํ•˜๋‚˜.

2022.02.15 - [project30-๋น„๊ณต๊ฐœ] - [iOS] ๐Ÿง‘๐Ÿป‍๐Ÿ’ป Xcode ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— XCTest ์ž‘์„ฑ ํŒŒ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ!

 

[iOS] ๐Ÿง‘๐Ÿป‍๐Ÿ’ป Xcode ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— XCTest ์ž‘์„ฑ ํŒŒ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ!

โœ… ์—๋Ÿฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. ๐ŸŸ  Library not loaded: @rpath/XCTest.framework/XCTest Xcode ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ, test๋ฅผ includeํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค์—ˆ๋‹ค๊ฐ€ ์ดํ›„์— ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผํ•ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋Œ๋ฆฌ..

rldd.tistory.com

์ด๊ฑฐ ํ•ด๊ฒฐํ•˜๋‹ค๊ฐ€ ๋จธ๋ฆฌ ํ„ฐ์งˆ๋ป” ... ใ…ใ…Ž .. 

 

 

โœ… NewsListPresenterTest.swift

//
//  NewsListPresenterTest.swift
//  KeywordNews
//
//  Created by Hamlit Jason on 2022/02/09.
//

import XCTest
@testable import KeywordNews

class NewsListPresenterTest: XCTestCase {
   
    var sut: NewsListPresenter!
    
    var viewController: MockNewsListViewController!
    var newsSearchManager: MockNewsSearchManager!
    
    override func setUp() {
        super.setUp()
        
        viewController = MockNewsListViewController()
        newsSearchManager = MockNewsSearchManager()
        
        sut = NewsListPresenter(viewController: viewController, newsSearchManager: newsSearchManager)
    }
    
    override func tearDown() {
        // tearDown์€ setUp์˜ ๋ฐ˜๋Œ€ ์ˆœ์„œ๋กœ ํ•˜๋Š”๊ฒŒ ์•ˆ์ „
        sut = nil
        
        newsSearchManager = nil
        viewController = nil
    }
    
    func test_viewDidLoad๊ฐ€_๋ถˆ๋ ค์กŒ์„๋•Œ() {
        sut.viewDidLoad()
        
        XCTAssertTrue(viewController.isCalledSetupNavigationBar)
        XCTAssertTrue(viewController.isCalledSetupLayout)
    }
    
    func test_didCalledRefresh๊ฐ€_์š”์ฒญ๋ ๋•Œ_request์—_์„ฑ๊ณตํ•˜๋ฉด() {
        newsSearchManager.error = nil
        
        sut.didCalledRefresh()
        XCTAssertTrue(viewController.isCalledReloadTableView)
        XCTAssertTrue(viewController.isCalledEndRefreshing)
    }
    
    func test_didCalledRefresh๊ฐ€_์š”์ฒญ๋ ๋•Œ_request์—_์‹คํŒจํ•˜๋ฉด() {
        newsSearchManager.error = NSError() as Error
        
        sut.didCalledRefresh()
        XCTAssertFalse(viewController.isCalledReloadTableView)
        XCTAssertFalse(viewController.isCalledEndRefreshing)
    }
}

์—๋Ÿฌ ํ•ธ๋“ค๋ง ํ•˜๋Š” ๋ถ€๋ถ„์ด ์กฐ๊ธˆ ํŠน์ดํ•œ๋ฐ, ๋งค๋‹ˆ์ €์˜ ์—๋Ÿฌ๋ฅผ ์ค„ ์ˆ˜๋„ ์žˆ๊ผฌ, ์•ˆ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

โœ… MockNewsSearchManager.swift

//
//  MockNewsSearchManager.swift
//  KeywordNews
//
//  Created by Hamlit Jason on 2022/02/09.
//

import Foundation
@testable import KeywordNews

final class MockNewsSearchManager: NewsSearchManagerProtocol {
    var error: Error?
    var isCalledRequest = false

    func request(
        from keyword: String,
        start: Int,
        display: Int,
        completionHandler: @escaping ([News]) -> Void
    ) {
        isCalledRequest = true

        if error == nil {
            completionHandler([])
        }
    }
}

์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๋งค๋‹ˆ์ €๋ฅผ ๋งŒ๋“œ๋Š” ๋ชจ์Šต์ด ํŠน์ดํ–ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ปดํ”„๋ฆฌ์…˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‹ค๋ฃฌ๋‹ค๋‹ˆ

 

 

โœ… MockNewsListViewController.swift

//
//  MockNewsListViewController.swift
//  KeywordNews
//
//  Created by Hamlit Jason on 2022/02/09.
//

import XCTest
@testable import KeywordNews

final class MockNewsListViewController: NewsListProtocol {
    var isCalledSetupNavigationBar = false
    var isCalledSetupLayout = false
    var isCalledEndRefreshing = false
    var isCalledMoveToNewsWebViewController = false
    var isCalledReloadTableView = false


    func setupNavigationBar() {
        isCalledSetupNavigationBar = true
    }

    func setupLayout() {
        isCalledSetupLayout = true
    }

    func endRefreshing() {
        isCalledEndRefreshing = true
    }

    func moveToNewsWebViewController(with news: News) {
        isCalledMoveToNewsWebViewController = true
    }

    func reloadTableView() {
        isCalledReloadTableView = true
    }
}

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ง„์งœ ์—„์ฒญ๋‚˜๊ฒŒ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค

Comments