post Image
privateなAPIをテストする方法を考えてみた

すこぶる同意。
ということで考えた。

型に、privateだけどtestしたいメンバがあるパターン

Hoge.swift
struct Hoge {
    init(x: Int) { self.x = x }

    /// privateだけどTestしたいメンバ
    fileprivate let x: Int
    fileprivate func doSomething(with string: String) -> String { return "\(string) \(x)" }
}

Targeted Extensionを使うとよさそう。

public protocol PrivatePublicatable {
    associatedtype Publicater
    var `private`: Publicater { get }
}
public final class Private<Base> {
    public let base: Base
    public init(_ base: Base) { self.base = base }
}
public extension PrivatePublicatable {
    var `private`: Private<Self> { return Private(self) }
}

↑こういうのを用意して…
Hoge.swift 内にextensionを書く。

Hoge.swift
extension Hoge: PrivatePublicatable {}
public extension Private where Base == Hoge {
    var x: Int { return base.x }
    func doSomething(with string: String) -> String {
        return base.doSomething(with: string)
    }
}

すると…

HogeTests.swift
let hoge = Hoge(x: 1)
hoge.private.x // 1
hoge.private.doSomething(with: "ほげ") // ほげ 1

外からアクセスできるけどprivateっぽさを明示できる。

そもそも型自身がprivateなパターン

Fuga.swift
private struct Fuga {
    let x: Int
    let y: Int
    func doSomething(with string: String) -> String { return "\(string) \(x) \(y)" }
}

型自体が外部から見えないので、アダプタとなる型を用意しないとどうしようもない。

Fuga.swift
/// Fugaをprivateに保つために作るTest用ラッパー。Fugaと同じファイル内に書く
final class FugaTester {
    private let base: Fuga
    init(args: (x: Int, y: Int)) {
        base = Fuga(x: args.x, y: args.y)
    }
    var x: Int { return base.x }
    var y: Int { return base.y }
    func doSomething(with string: String) -> String {
        return base.doSomething(with: string)
    }
}
FugaTests.swift
let tester = FugaTester(args: (x: 1, y: 2))
tester.x // 1
tester.y // 2
tester.doSomething(with: "ふが") // "ふが 1 2"

辛い…本当にこの道しかないんでしょうか…
ないとしても、ボイラープレートの山なので、Testerは自動生成したさありますね。
(すごい要望があればXcode Source Editor Extensionを作るのもやぶさかではない)

補足


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。