Swift의 모크 생성 라이브러리 "Mockolo"설정 및 작업 방법

10754 단어 SwiftMockoloMock

입문


Xcode는 Moke 생성 기능을 탑재하지 않아 수동 설치가 힘들어 가져오기로 했습니다.

"Mockolo"가 뭐예요?


이것은 Swift에 사용되는 모델 생성 라이브러리입니다.
현재 프로토콜의 모델 생성만 지원하고 클래스의 모델 생성은 추가될 예정입니다.
1.1.3 생성 클래스도 지원합니다.
https://github.com/uber/mockolo/releases/tag/1.1.3

환경

  • OS:macOS Catalina 10.15.2
  • Swift:5.1.3
  • Xcode:11.3 (11C29)
  • Mockolo:1.1.1
  • 설치하다


    Mockolo 설치


    Mint에서 설치합니다.
    Mintfile
    + uber/[email protected]
    
    $ mint bootstrap
    
    수동으로 설치하려면 공식 문서를 참조하십시오.
    https://github.com/uber/mockolo#build--install

    구축 시 모델 생성


    모콜로가 모크를 생성하는 시간이 빠르기 때문에 구축할 때마다 모크를 생성합니다.
    구축 시간에 신경을 쓰면 명령을 수동으로 실행하여 모델을 생성합니다.
    Xcode에서 항목 열기
    TARGETS에서 제품 대상 선택 > 구축 단계 > + > 새 실행 단계 > 를 클릭합니다.
    드래그 앤 드롭 중 소스를 완료하기 전에 탐색

    스크립트는 "Generate Mocks with Mockolo"처럼 알기 쉬운 이름으로 명명할 수 있습니다.
    다음 스크립트를 확장하고 작성합니다.
    if which mint >/dev/null; then
      rm -f $SRCROOT/MockResults.swift
      mint run mockolo mockolo --sourcedirs $SRCROOT/{製品ターゲット名} --destination $SRCROOT/MockResults.swift
    else
      echo "warning: Mint not installed, download from https://github.com/yonaskolb/Mint"
    fi
    
    트레일러가 이미 존재하면 구축 오류가 발생할 수 있으므로 생성하기 전rm에 삭제합니다.
    파일 내보내기 > + 를 클릭합니다.
    설명--destination에서 지정한 파일 경로입니다.
    $SRCROOT/MockResults.swift
    
    생성된 파일을 작성하지 않으면 CI/CD에서 다음 오류가 발생합니다.
    error: Build input file cannot be found:
    
    아래의 보도를 참고하도록 허락해 주십시오.
    https://qiita.com/lovee/items/fa3ef5e60cfbf31996c0

    int를 사용하지 않으면 취소mint run mockolo하고 if 문장의 조건을 변경합니다.
    사용 중인 옵션을 설명합니다.
    다음 두 가지가 필요합니다. 필요에 따라 값을 변경하십시오.
    탭 페이지에서 항목 작성 또는 편집
    설명
    --sourcedirs
    객체 폴더 경로 생성 제품 대상 이름의 폴더를 지정하면 일반적으로 모든 파일을 객체로 사용할 수 있습니다.
    --destination
    모크 생성 경로--mock-final는 임의의 것이지만 나는 끼는 것을 좋아한다.
    탭 페이지에서 항목 작성 또는 편집
    설명
    --mock-final
    모크final에 1.2.8 추가
    기타 옵션은 공식 홈페이지 또는 mockolo --help 을 참조하십시오.
    프로젝트를 구성하고 [$SRCROOT (일반적으로 프로젝트 루트 폴더)]에서 [MockResults.swift] 를 생성한 후 프로젝트로 드래그합니다.

    복사됨 확인란을 닫고 완료를 클릭합니다.

    버전 제어에서 무시


    불필요한 충돌을 피하기 위해 생성된'MockResults.swift'를 버전 제어에서 제외합니다.
    Git를 사용할 때는 다음을 ".gitignore"에 추가하면 됩니다.
    .gitignore
    + MockResults.swift
    

    조작 방법


    모델을 생성할 프로토콜에 대한 설명@mockable을 추가합니다.
    유형 별칭이 있으면 괄호 안에 쓰십시오.
    Foo.swift
    /// @mockable(typealias: T = AnyObject; U = StringProtocol)
    public protocol Foo {
        associatedtype T
        associatedtype U: Collection where U.Element == T 
        associatedtype W 
    
        var num: Int { get set }
    
        func bar(arg: Float) -> String
    }
    
    구축은 몽판을 생성합니다.
    MockResults.swift
    // クラス名は `{プロトコル名}Mock` となる
    public class FooMock: Foo {
        typealias T = AnyObject
        typealias U = StringProtocol
        typealias W = Any // 指定しないと `Any` になる
    
        init() {}
        init(num: Int = 0) {
            self.num = num
        }
    
        var numSetCallCount = 0
        var underlyingNum: Int = 0
        var num: Int {
            get {
                return underlyingNum
            }
            set {
                underlyingNum = newValue
                numSetCallCount += 1
            }
        }
    
        var barCallCount = 0
        var barHandler: ((Float) -> (String))?
        func bar(arg: Float) -> String {
            barCallCount += 1
            if let barHandler = barHandler {
                return barHandler(arg)
            }
            return ""
        }
    }
    
    자동으로 생성된 코드에서 테스트에 사용되는 속성만 설명합니다.
    속성
    설명
    {속성 이름} CallCount 설정
    호출자 호출 횟수
    메소드 이름}CallCount
    메소드 호출 횟수
    {메소드 이름}Handler
    메소드 호출 시 실행되는 엔클로저
    테스트 시 다음과 같이 사용합니다.
    FooTests.swift
    func testMock() {
        // モックを生成する
        let mock = FooMock(num: 5)
    
        // 対象プロパティのセット回数を確認する
        XCTAssertEqual(mock.numSetCallCount, 1)
    
        // ハンドラは対象メソッドの呼び出し前に自分で代入する
        mock.barHandler = { arg in
            return String(arg)
        }
    
        // 対象メソッドの呼び出し回数を確認する
        XCTAssertEqual(mock.barCallCount, 0)
    }
    

    끝내다


    쉽게 모형이 만들어졌어요!
    이렇게 하면 테스트 시 수동으로 VIPER 트레일러를 설치하는 번거로움을 줄일 수 있다😊
    일찍 도입됐으면 좋겠어요.

    참조 링크

  • uber/mockolo: Efficient Mock Generator for Swift
  • R.swift 설정 방법(Swift5) - Qiita
  • 좋은 웹페이지 즐겨찾기