Unit test 라이브러리로 많이 쓰이는 Quick과 Nimble..! 왜 유명한 것인지 Nimble부터 살펴보자 ☺️ [1] XCTAssert 와는 달리 매번 사용자 임의 실패 메시지를 지정할 필요가 없다 XCTAssert에서 실패 메세지를 작성해주지 않으면, XCTAssertTrue(contains(sillyMonkeys, kiki)) 테스트가 실패했을 때 달랑 "XCTAssertTrue failed" 이라는 실패메세지를 받게 된다 그래서 보통 이렇게 실패 메시지를 함께 작성한다 XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'") 테스트가 실패했을 때 "Expected sillyMonkeys to..
[1] debounce - 타이머를 지정해두고 타이머가 끝난 시점에 가장 최근의 값을 방출해준다. - 이벤트가 방출될때마다 타이머가 초기화된다. - 사용예제: 타이머를 2초로 지정해두면, 사용자가 버튼을 폭풍 누르다가 더이상 버튼을 안누르고 2초가 지날때 가장 마지막 클릭 이벤트를 준다. [2] throttle - 타이머를 지정해두고 이벤트가 처음 방출되면 타이머 동안 어떤 이벤트도 방출되지 않는다. - 이벤트가 방출될때마다 타이머가 초기화되지 않는다. - 사용예제: 타이머를 2초로 지정해두면, 사용자가 버튼을 폭풍 누를때 처음 클릭 이벤트만 주고 2초동안 어떠한 클릭이벤트도 주지 않는다. (다만 latest를 어떻게 설정해주냐에 따라 조금 다른데 밑에서 확인!_!) [2.1] throttle lates..
[1] 실패하는 테스트를 작성한다 10/2 = 5 인지 나눗셈 테스트 해보는 코드인데 당연히 실패한다. Calculator를 만들지도 않았기 때문에-! [2] 빨리 테스트가 통과하게끔 만든다. (또는 컴파일에러가 안나게 일단 막 만들 수 도 있는데 간단한 함수라 바로 구현함) [3] 이제 제대로 동작하는 지를 검사하겠다는 마인드를 지닌다. 다른 실패할 테스트를 만들어본다 (0으로 나눴을때) [4] 테스트가 통과하게끔 만든다 이런식으로 테스트 코드를 먼저 만들고 구현을 점진적으로 해나가는 것이 TDD의 느낌(?) 인 것 같다 그리고 테스트주도개발 에서 나온 것 처럼 일단 빨리 테스트를 통과하게 만들고 그 와중에 생겨난 중복제거 등 리팩토링을 마지막 단계로 해줄 수 도 있다 기능구현을 하고 테스트 코드를 뒤..
테스트 코드부터 작성하는 것이 감이 안와서 테스트 코드보다 먼저 ArtistAPIService를 작성해버렸다... 🙄 이전 포스팅에서 만들었던 ArtistAPIType을 이용하여...!!! 물론 다음과 같이 Artist모델도 만들어줬다...!!! 그리고 Apple Music API 홈페이지에 들어가서 해당 API에 해당하는 더미데이터를 복붙하여 넣어준 더미데이터 파일을 만들고 테스트 코드 있는 쪽에 넣어준다 BananaMusicTests 그룹안에 넣어주면 된다 (나의 토이프로젝트 이름은 BananaMusic이기때문...ㅎㅎ!! ) 그리고 실제 서버에서 주는 데이터가 아니라 이 더미데이터를 파싱하는 ArtistAPIServiceStub 을 만든다 (Stub, Mock, Spy 등등 다양한 용어들이 있던데 ..
테스트 코드를 제대로 공부하고 싶어서 예제 프로젝트를 진행중이다 아직 유닛테스팅도 잘 작성하지 못하지만 TDD 어떤지 너무 궁금해서 해보기로 했다 :-) 띄엄띄엄 조금조금 공부중인데 흐름을 놓치지 않도록 잘 정리해서 기록해두자 주제는 Apple Music API를 이용한 토이 프로젝트...!!! Apple Music API는 이렇게 모든 API마다 response json을 친절하게 알려주는데, 이 json을 dummy data로 쓰기에 딱 좋기 때문이다 일단 Apple Music API를 사용하기 위해서는 developer token이 필요하다 이 순서대로 차근차근 해서 keyID, teamID 를 알아내고 나의 private key가 담긴 .p8 file을 얻어내야한다 https://developer..
Signal와 Driver는 UI 계의 PublishSubject / BehaviorSubject 같은 것...! Signal과 Driver 의 공통점 - error를 return 하지 않는다. - 메인 쓰레드에서의 작동을 보장한다. - Rxcocoa에 있음 Signal과 Driver 의 차이점 - Signal은 새로운 구독자에게 replay 해주지 않는다. (Driver 처럼 구독하는 순간 초기값이나 최신값을 주지 않는다. 구독한 이후에 발행되는 값을 받음. 위의 사진 참고) - Signal은 emit함수로 이벤트 처리 / Driver는 drive함수로 이벤트 처리 signal.emit(onNext: { (element) in } driver.drive(onNext: { (element) in } Rx..
https://medium.com/gett-engineering/rxswift-share-ing-is-caring-341557714a2d RxSwift: share()-ing is Caring - Gett Engineering - Medium RxSwift resource sharing can be hard. Learn about share(), which lets you define streams that share resources among their subscribers. medium.com 설명이 너무 감동적..🥺 share란 publish와 같은 컨셉인데, 옵져버블 공유를 위한 연산자이다 하지만 publish와 다르게 connect가 필요없다...! (👍) 그리고 publish는 옵져버블이 끝..
iOS 디자인 패턴(MVC/MVVM/VIPER/Clean Swift/MVC-C /MVVM-C ) 을 다 쓰지 못했지만...!ㅠㅠ 일단 정리 MVVM도 다양한 종류가 있어서 정리를 해보고자 한다 ViewModel이 Model을 다루고 View는 다루지 않는다는 컨셉은 동일하고 두가지 옵션을 선택하여 쓰는 것 같다 1) ViewModel이 Coordinator(Navigation을 담당하는 녀석)에게 말하느냐 안하느냐 MVVM에서는 Navigation 관련 코드를 Coordinator 또는 Navigtor라는 녀석에게 다 맡긴다. 보통 Coordinator라고 많이 부르고 이런 디자인 패턴을 MVVM-C 라고 부른다. 이 Coordinator에게 "여기 화면으로 이동 좀 해주세요~" 하는 요청을 ViewMo..
viewController가 deinit 될때, 그 안의 Pulisher가 auto-cancel 되는지 실험해봅시다 --! 5초 후에 이벤트를 발행하는 Publisher와 3초 후에 deinit되는 viewController가 있습니다 1) stream을 안담아줄 때 viewController가 deinit되어도 스트림이 살아있습니다 2) stream을 Cancellable에 담아줄 때 viewController가 deinit되어도 여전히 스트림이 살아있습니다 3) stream을 Cancellable에 담아주고 deinit 때 cancel 시켜줄 때 이렇게 deinit 될때 cancel시키는 코드를 넣어줘야지 스트림이 같이 끝납니다 4) stream을 AnyCancellable에 담아줄 때 AnyCanc..
이 포스팅을 이해하려면 RxSwift vs Combine - 스펙 / 성능 / 개념 비교를 읽고 오세요 ☺️ Rxcocoa(for UIKit) + RxSwift 로 짰던 코드를 -> UIKit + Combine -> SwiftUI + Combine 이렇게 두 가지 버전으로 바꿔보았습니다 :) 우선 Model/ViewModel 쪽 코드는 큰 차이가 없었습니다 APIManager 안에 있는 fetch 함수를 예로 봅시다 (isbn number를 받아서 책정보를 주는 함수입니다) Observalbe을 AnyPulisher로 바꾸면 끝입니다 그 다음 APIMananger의 fetch 함수를 부르는 ViewModel 쪽 코드를 봅시다 여기도 subscribe를 sink로 바꿔주면 끝입니다 하지만 UIBinding..
- Total
- Today
- Yesterday
- 플러터 얼럿
- drf custom error
- Flutter 로딩
- Flutter getter setter
- github actions
- flutter build mode
- flutter deep link
- 구글 Geocoding API
- Watch App for iOS App vs Watch App
- Python Type Hint
- PencilKit
- 장고 Custom Management Command
- Sketch 누끼
- SerializerMethodField
- Flutter Text Gradient
- cocoapod
- 플러터 싱글톤
- ribs
- Dart Factory
- DRF APIException
- Flutter Clipboard
- Django Firebase Cloud Messaging
- flutter dynamic link
- Django Heroku Scheduler
- flutter 앱 출시
- ipad multitasking
- 장고 URL querystring
- Flutter Spacer
- Django FCM
- METAL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |