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

[XCTest] RxTest ์™€ RxBlocking์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž ๋ณธ๋ฌธ

apple/๐Ÿ—ฝ XCTest

[XCTest] RxTest ์™€ RxBlocking์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 2. 20. 15:31

RxTest / RxBlocking

 

โœ… ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

Rx... ์–˜๋‚ด ๋„๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ• ๊นŒ ๊ณ ๋ฏผ ๋งŽ์ด ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋Ÿฐ ๋„๊ตฌ๋“ค์ด ์žˆ๋‹ค๋‹ˆ!

 

์—ฌ๋‹ด์ด์ง€๋งŒ ์ด๋Ÿฐ๊ฑฐ Kuringํ”„๋กœ์ ํŠธ ํ•˜์‹œ๋Š” ๋ถ„์˜ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ๋ณด๋Š”๋ฐ ์•ฝ๊ฐ„ ์น˜์ž„;;

Swift์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๊ตณ์ด Rx๋ฅผ ํ•˜๋Š”๊ฒŒ ๋„์›€์ด ํด๊นŒ?? ์ƒ๊ฐ๋„ ๋“ค์ง€๋งŒ ์•„๋ฌดํŠผ ๊ณต๋ถ€ํ•ด๋ณด์ž

(UIButton์˜ rx.tap ๋ชป์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ใ„ท.ใ…)

 

๐ŸŸ  RxTest๋ž€?

Observable์˜ ๊ฐ€์ƒ์˜ ์‹œ๊ฐ„ ๊ฐœ๋…์„ ์ฃผ์ž…ํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์ƒ์˜ ์‹œ๊ฐ„์ด ๋‹ค ํ๋ฅผ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด.

 

๊ฐ ์ดˆ์— ๋ฌธ์žํ•˜๋‚˜ ๋ฐฉ์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •
1์ดˆ -> "A"
2์ดˆ -> "B"
3์ดˆ -> "C"

// 2sec์— B๊ฐ€ ๋‚˜์™”๋Š”์ง€ ๊ฒ€์ฆ

 

โœ… RxTest

    // ๊ฐ€์ƒ์˜ ์‹œ๊ฐ„ ํ๋ฆ„ ์ƒ์„ฑ
    let scheduler = TestScheduler(initialClock: 0)
    
    // ์›ํ•˜๋Š” ์‹œ์ ์— Event๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” Observable ์ƒ์„ฑ(๊ตฌ๋… ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์ด๋ฒคํŠธ ๋ฐœ์ƒ)
    let obsevable = scheduler.createHotObservable([
        .next(1, "A"),
        .next(2, "B"),
        .next(3, "C")
    ])
    
    // ์›ํ•˜๋Š” ์‹œ์ ์— Event๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” Observable ์ƒ์„ฑ(๊ตฌ๋…์ด ์‹œ์ž‘๋˜์–ด์•ผ ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ)
    let obsevable = scheduler.createColdObservable([
        .next(1, "A"),
        .next(2, "B"),
        .next(3, "C")
    ])
    
    // String์„ ๊ด€์ฐฐํ•˜๋Š” Observer ์ƒ์„ฑ
    let observer = scheduler.createObserver(String.self)
    

    // ๊ด€์ฐฐ์ž๋ฅผ ํ†ตํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” ์˜ต์ €๋ฒ„๋ธ” ๊ตฌ๋…
    obsevable
        .subscribe(observer)
        .disposed(by: bag)
            
    // ๊ด€์ฐฐ์‹œ์ž‘
   scheduler.start()
   
   // Nimble ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•œ Test Assertion
   expect(observer.events).to(
            equal([
                .next(1, "A"),
                .next(2, "B"),
                .next(3, "C")]
                 )

 

์œ„์—๋ณด๋ฉด Hot์ด๋ž‘ Cold ๋‚˜์˜ค๋Š”๋ฐ, Rx์ฒ˜์Œ ๊ณต๋ถ€ํ• ๋•Œ ๋ฌด์ง€ ์–ด๋ ต๋˜๊ฑฐ ์ด์ œ ๋‹ค ์ดํ•ด๊ฐ€๋Šฅ ใ…Ž~!

 

 

๐ŸŸ  RxBlocking์ด๋ž€?

Observable์˜ ์ด๋ฒคํŠธ ๋ฐฉ์ถœํ•˜๊ณ  ํŠน์ • ์‹œ๊ฐ„๋™์•ˆ ๋ฐฉ์ถœ๋œ Observable์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฒ€์ฆ

 

RxTest์— ์žˆ์—ˆ๋˜ ์Šค์ผ€์ค„๋Ÿฌ๋ž€ ๊ฐœ๋…์€ ์—†์Œ

 

๊ฐ ์ดˆ์— ๋ฌธ์žํ•˜๋‚˜ ๋ฐฉ์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •
1์ดˆ -> "A"
2์ดˆ -> "B"
3์ดˆ -> "C"

// ["A","B","C"]

 

โœ…RxBlocking

    // Observable -> BlockingObservable
    let obsevable = Observable.of("A","B","C").toBlocking() 
    
    // Observable์˜ .next ์ด๋ฒคํŠธ๋ฅผ Array๋กœ ์ „ํ™˜
    let values = try! observable.toArray() // ์–ด๋ ˆ์ด ์ „ํ™˜์ด ์ปดํ”Œ๋ฆฟ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
    
    // Nimble์˜ ๋ฌธ๋ฒ• ํ™œ์šฉํ•œ Test Assertion
    expect(values).to(equal(["A","B","C"]))

๋งŒ์•ฝ ์ปดํ”Œ๋ฆฟ์ด ๋˜์ง€ ์•Š์•„๋„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด .toBlocking(timeout: 2) ์ด๋Ÿฐ์‹์œผ๋กœ ์ธ์ž๊ฐ’์„ ์ฃผ๋ฉด ๋œ๋‹ค.

 

 

๋‹จ์ˆœํžˆ ๋ฐฉ์ถœ๋˜๋Š” ๊ฐ’๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ธ”๋กํ‚น์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๊ณ 

์Šค์ผ€์ค„๋Ÿฌ์˜ ๊ฐœ๋…์ด ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค๋ฉด test๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

Comments