Saturday 3 March 2018

시간 초과없이 신속하게 대기 상태 3


시간 초과없이 신속한 대기 상태 3
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
xcode 7.3 UI 테스트가 무작위로 실패하거나 실패합니다.
나는 단지 TDD를 연습하고 테스트 애플 리케이션을위한 아주 간단한 기능을 썼다. UI는 간단합니다. 처음에는 제목이 "0"인 버튼이 있습니다. 내보기 컨트롤러에서, 나는 지역 변수 "점수"있습니다. 버튼을 누를 때마다 "점수"가 올라갑니다. 버튼 제목이 새로운 "점수"값으로 업데이트됩니다. 버튼 UI 업데이트 로직은 "score"의 "didSet"속성 관찰자에 있습니다.
UI 테스트를 제외한 모든 것이 멋집니다. 두 가지 테스트 기능이 있는데, 하나는 버튼을 탭하고 다른 하나는 버튼을 두 번 탭하는 것입니다. 이제 이상한 일이 일어난다. 아래는 나의 두 가지 UI 테스트 기능의 스크린 샷입니다.
테스트를 실행할 때마다 때로는 두 가지 기능이 모두 실패하는 경우가 가끔 있습니다. 오류는 항상 "aNumber가 aNumber + 1과 같지 않음"과 같습니다. 응답 시간 문제가있는 것처럼 보입니다. UI 업데이트가 버튼 레이블 결과 검색보다 훨씬 느린 것 같습니다. 정말 업데이트되기 전에 button. label의 가치를 얻는 지 확실하지 않습니다. 부동산 옵서버에서 UI를 업데이트해야합니까? ui 테스트를 통과하는 솔루션이 있습니까? 당신의 도움에 감사드립니다!
때로는 하나 또는 두 개의 함수가 실패하는 동안 두 함수가 모두 전달되었습니다.
UITest는 별도의 프로세스로 실행됩니다. 따라서 버튼 제목 업데이트가 XCTAssert보다 느리면 oldValue를 예상 값과 비교하므로 실패합니다.
버튼을 탭한 후 올바르게 테스트 해보십시오.
이 함수를 사용하여 waitForExpectationsWithTimeout (3, nil)
나는 그것이 당신에게 효과가 있기를 바랍니다 :)
내 iPhone에서 테스트가 통과되는 동안 시뮬레이터에서 동일한 문제가 발생했습니다.
나는 다음과 같이 시뮬레이터의 지연을 추가했다.

클린 스위프트 TDD 파트 3 & # 8211; 노동자.
파트 1과 파트 2에서 각각 ListOrdersViewController 및 ListOrdersInteractor를 테스트했습니다. 하지만 우리는 OrdersWorker를 조롱했기 때문에 매달려있었습니다.
이 게시물에서 OrdersWorker가 올바른 주문을 반환하는지 테스트합니다.
하지만 먼저 데이터 저장소에서 주문을 가져 오는 실제 세부 사항을 추상화 해 봅시다. 이 프로세스에서 다음 데이터 저장소를 개발할 것입니다.
OrdersWorker는 이러한 데이터 저장소를 사용할 수 있습니다. 사용하기로 선택한 데이터 저장소의 유형에 불가 지합니다.
데이터 저장소가 무거운 짐을 들게하십시오.
프로덕션 응용 프로그램에서 주문은 코어 데이터 또는 네트워크를 통해 저장 될 수 있습니다. 그러나 가능한 한 빨리 개발 및 실행 테스트를 위해 코어 데이터 또는 네트워크에서 주문을 가져오고 싶지는 않습니다. 대신에 메모리 저장소를 만들고 싶습니다. 메모리가 가장 빠른 저장 공간입니다!
먼저 OrdersWorker를 공통 API로 설계하여 스와핑 데이터 저장소가 간단 해 지도록합시다.
OrdersStoreProtocol을 추가하고 fetchOrders () 메서드를 선언합니다. OrdersStoreProtocol 형식의 ordersStore 변수를 OrdersWorker 클래스에 추가하십시오. ordersStore를 인수로 사용하여 이니셜 라이저를 추가하십시오.
OrdersWorker. swift 파일의 모양은 다음과 같습니다.
그런 다음이 세 가지 데이터 저장소를 만들고 방금 정의한 OrdersStoreProtocol을 준수하도록합니다. 그냥 지금 빈 fetchOrders () 메소드를 추가하십시오.
새 OrdersMemStore. swift 파일을 만듭니다.
새 OrdersCoreDataStore. swift 파일을 만듭니다.
새 OrdersAPI. swift 파일을 만듭니다.
나중에 다음과 같이이 세 가지 데이터 저장소를 쉽게 교체 할 수 있습니다.
OrdersWorker의 이니셜 라이저 (또는 생성자)에서 필요로하는 프로토콜과 동일한 프로토콜을 따르는 다른 개체를 전달하는이 기술을 생성자 종속성 주입이라고합니다.
실제로 각 데이터 저장소에서 주문을 가져 오는 방법에 대한 자세한 내용은 데이터 저장소 자체의 구현과 관련됩니다. OrdersWorker는 OrdersStoreProtocol API의 소비자 일뿐입니다.
TDD 이전에 일부 가사.
방금 OrdersWorker 개체가 인스턴스화되는 방식을 변경했습니다. 이제 ListOrdersInteractor를 수정하여 ordersWorker가 테스트 목적으로 OrdersMemStore를 사용하도록하십시오.
이제 프로젝트를 다시 컴파일해야합니다.
종속성을 분리합니다.
항상 그렇듯이 먼저 종속성을 식별하고 격리하는 것이 매우 유용합니다. OrdersWorker 및 ordersStore 변수가 외부 데이터 저장소를 가리키는 지 테스트하고 있습니다. 그것이 메모리, 코어 데이터 또는 네트워크를 통 하든지 상관없이 그것은 의존성입니다. 그것을 조롱하자.
주문을 가져 오는 비동기 (백그라운드 및 비 차단) 특성을 시뮬레이트하기 위해 GCD를 사용하여 completionHandler를 1 초 동안 연기하도록 연기합니다.
fetchOrders () 메서드는 즉시 반환됩니다. 1 초 후 completionHandler가 메인 큐에서 실행됩니다. 몇 개의 주문을 만들어 배열로 반환합니다.
이 OrdersMemStoreSpy는 OrdersWorkerTests 클래스 안에 있으며, 다음에 보게 될 것입니다.
테스트를 먼저 작성하십시오.
마지막 게시물에서는 OrdersWorker를 조롱하여 ListOrdersInteractor를 테스트했습니다. 이제 OrdersWorker가 데이터 저장소에서 실제 주문을 가져 오도록 TDD 할 차례입니다.
setupOrdersWorker () 메서드에서 OrdersWorker 인스턴스 인 테스트 대상을 설정하여이 게시물의 시작 부분에 작성한 OrdersMemStoreSpy를 사용합니다.
Given에서는 먼저이 스파이에 대한 참조를 얻으므로 나중에 어설 션을 작성할 때 검사 할 수 있습니다.
When에서는 XCTest의 비동기 테스트 지원을 사용합니다. 먼저 expectationWithDescription () 메서드를 호출합니다. 그런 다음 fetchOrders () 메소드를 호출하십시오. 블록 내부에서 fulfill () 메서드를 호출하여 기대를 충족시킵니다.
그런 다음, 보통 때와 마찬가지로 fetchOrders () 메서드가 호출되었는지 확인합니다. waitForExpectationsWithTimeout ()을 호출하여 1.1 초 (OrdersMemStoreSpy의 dispatch_after보다 조금 더 오래 기다림)를 수행하여 기대치를 충족시킵니다. 기대가 충족되면 완료 핸들러가 제대로 실행됨을 의미합니다. 정확히 당신이 원하는.
논리를 구현하십시오.
OrdersWorker가 완료 처리기를 즉시 호출하고 빈 주문 배열을 반환하기 때문에 현재 테스트가 실패합니다. 주문 없음!
통과합시다.
OrdersWorker의 fetchOrders () 메서드를 수정하여 새 ordersStore 변수를 사용하여 다음과 같이 데이터 저장소에서 주문을 가져옵니다.
completionHandler를 즉시 호출하고 빈 주문 배열을 반환하는 대신 ordersStore에서 fetchOrders () 메서드를 호출합니다. fetchOrders ()가 완료되면 fetchOrders () 메서드 블록에서 completionHandler를 호출합니다.
또한 ordersStore에서 리턴 한 주. 결과를 리턴하기 위해 completionHandler 호출을 수정하십시오.
지금 테스트를 실행하면 통과해야합니다. 이 TDD 예제의 모든 코드와 테스트는 GitHub에서 찾을 수 있습니다.
우리는 귀빈 싸이클에서 조금 벗어나 바로 노동자에게 조종했습니다. 그런 다음 TDD를 사용하여 OrdersWorker를 개발합니다.
먼저 간단한 API 계약을 정의했습니다. 단일 fetchOrders () 메소드를 사용하여 OrdersStoreProtocol. 그런 다음 OrdersMemStore, OrdersCoreDataStore 및 OrdersAPI라는 세 가지 데이터 저장소를 만들었습니다. 모두 OrdersStoreProtocol을 준수합니다. OrdersWorker는 생성자 종속성 주입을 사용하여이 세 가지 데이터 저장소 중 하나를 자유롭게 선택합니다. ordersStore에 대한 OrdersWorker의 종속성을 분리하기 위해 OrdersMemStoreSpy를 만들었습니다. GCD를 사용하여 주문을 비동기 적으로 반환합니다. testFetchOrdersShouldReturnListOfOrders () 테스트를 작성하여 데이터 저장소의 fetchOrders () 메소드가 호출되었는지 확인합니다. 또한 XCTest의 비동기 테스트 지원을 사용하여 기대치를 충족시키고 기다릴 수 있습니다. 처리가 완료되면 데이터 저장소의 fetchOrders () 메소드가 일부 주문을 반환했음을 알 수 있습니다.
다음 글에서는 TDD를 사용하여 발표자를 테스트하여 VIP 사이클을 마치도록하겠습니다.
이 게시물을 공유하십시오 :
나는 아이폰으로 데뷔 한 이후로 iOS에서 개발 중이며 발표 될 때 Swift로 뛰어 올랐다. 깨끗한 아키텍처로 잘 테스트 된 앱을 작성하는 것이 내 목표였습니다.
소식 탐색.
11 개의 댓글.
Swift가 sut. ordersStore를 OrdersMemStoreSpy 유형으로 다운 캐스팅 할 수없는 이유가 있습니까? 이 때문에 내 테스트가 통과하지 못했습니다.
절대로 OrdersMemStoreSpy 대신 OrdersMemStore를 사용하여 작업자를 생성했습니다. 내 잘못이야.
sut. ordersStore를 다음과 같이 설정하십시오! OrdersMemStoreSpy가 다운 캐스트가 아닙니다. sut. ordersStore는 구체적인 유형이 아닙니다. 그것은 프로토콜 유형입니다. OrdersStoreProtocol을 따르는 클래스는 sut. ordersStore에 할당 할 수 있습니다.
먼저 iOS 프로젝트를 구성하고 구조화하는 더 나은 방법을 제공하기 위해 열심히 노력하고 헌신 해 주신 것에 대해 감사드립니다. 나에게 방해가되는 것을 되돌려 라. 새로운 OrdersWorker 클래스를 만드는 대신 이미 프로젝트에있는 일부 작업자를 사용하지 않는 이유는 무엇입니까? 왜 ListOrdersWorker에 아무것도 넣지 않았습니까?
ListOrdersWorker는 ListOrders 장면과 관련된보다 복잡한 비즈니스 논리를위한 것입니다. OrdersWorker는 여러 장면에서 공유되고 재사용됩니다. 다른 장면에서 주문을 표시하고 생성하고 표시해야하므로이 논리를 공유 된 OrdersWorker에 넣어 다른 곳에 복사하지 않아도됩니다. 그것은 의미가 있습니까?
그건 완벽하게 이해가됩니다. ListOrdersWorker는 ListOrders 사용 사례와 관련된 일부 논리를 대상으로합니다. 예를 들어, 클라이언트가 어떤 방식 으로든 주문을 정렬 할 수있는 옵션이있는 경우, 날짜보다 복잡한 경우 인터랙 터의 명확성을 유지하기 위해 해당 논리를 작업자에게 배치해야합니다. 제 생각에 틀렸을 때 제게 정정하십시오.
네, 맞습니다.
귀하의 게시물을 보내 주셔서 감사합니다. 내 질문은 다음과 같습니다 :
메인 스레드에서 Worker 호출을 호출하는 이유는 무엇입니까? 내가 더 나은 솔루션을 생각하는 경우에만 presenter. output 프로토콜 (뭔가, 그 ViewController에 표시하기 위해 전달해야합니다, 모든 UI 작업을 메인 스레드에서 호출해야하기 때문에, 경우에, 발표자로 메인 스레드에서 뭔가를 호출하는 것 같아요 ).
수행 할 작업이 짧고 동기적인 경우 배경 스레드를 사용할 필요가 없습니다. 비동기 대 동기 및 VIP주기는 별도의 고려 사항입니다.
이 위대한 게시물 주셔서 감사합니다. 나는 질문이있다.
어떻게 근로자를 보금 자리로합니까?
예를 들어 OrdersWorker를 사용하여 주문을 가져 오면 주문 속성 중 하나는 네트워크를 통한 이미지입니다. 비동기 호출을 사용하여 이미지를 다운로드해야하며, VIP로이 작업을 수행하려면 어떻게해야합니까?
요구 사항에서 이미 가져온 이미지를 사용하여 전체 주문을 구성해야한다고 나와있는 경우 주문을 가져온 직후에 대화 상대에게 거품을 내기 전에 비동기 호출을 실행하여 이미지를 가져올 수 있습니다.
그러나 뷰에서 이미지를 가져 와서 렌더링하기를 기다리는 동안 주문 세부 정보를 먼저 표시 할 수 있다고 요구하는 경우 주문을 볼 때 결과를 뷰에 표시하고 비동기 호출을 실행하여 이미지를 가져올 수 있습니다 사용자에게 표시됩니다.

시간 초과없이 신속한 대기 상태 3
당겨 요청 2.
[accept-ios-sdk] : Unit 테스트를 Swift 3으로 마이그레이션.
83 개의 추가 및 77 개의 삭제로 5 개의 변경된 파일 표시.
아차! 문제가 발생했습니다. 다시 해 보다.
커밋 2c9cdc9에 대한 코멘트.
&부; 2017 GitHub, Inc. 용어 개인 정보 보안 상태 도움말.
현재이 작업을 수행 할 수 없습니다.
다른 탭이나 창을 사용하여 로그인했습니다. 새로 고침하여 세션을 새로 고침하십시오. 다른 탭이나 창에서 로그 아웃했습니다. 새로 고침하여 세션을 새로 고침하십시오.

시간 초과없이 신속한 대기 상태 3
당겨 요청 0.
신속한 3 API 리팩토링.
305 추가 및 251 삭제 11 변경된 파일 표시.
큰 diff는 기본적으로 렌더링되지 않습니다.
아차! 문제가 발생했습니다. 다시 해 보다.
아차! 문제가 발생했습니다. 다시 해 보다.
커밋 f8585a1에 0 개의 댓글.
&부; 2017 GitHub, Inc. 용어 개인 정보 보안 상태 도움말.
현재이 작업을 수행 할 수 없습니다.
다른 탭이나 창을 사용하여 로그인했습니다. 새로 고침하여 세션을 새로 고침하십시오. 다른 탭이나 창에서 로그 아웃했습니다. 새로 고침하여 세션을 새로 고침하십시오.

No comments:

Post a Comment