みなさんtestしてますか?
わたしはもちろんできてません
しようとは思っているのですが状態です。
そこで、とりあえず始めてみたらtestを書く習慣がつくのではないかと思い始めました。
そこで、詰まったのが自作構造体の比較です
XCTestには、XCTAssertEqual
というメソッドあります。
このメソッドは、Equatable
に準拠しているものを比べて、同じならテスト成功。違うとテスト失敗にしてくれます。
文字列の場合
func testString() {
let expected = "foo"
let actual = "foo"
XCTAssertEqual(expected, actual)
}
成功しましたね
String型はEquatableに準拠しているんですね!
自作構造体の場合
struct User {
let name: String
let age: Int
}
自作構造体を作りました!
このUserを比較したい時がきっとあるはず!
func testUser() {
let expected = User(name: "foo", age: 10)
let actual = User(name: "foo", age: 10)
XCTAssertEqual(expected, actual)
}
比較したいのならば、Equatableに準拠しなさいと言われます。
なので、Equatableに準拠させます
extension User: Equatable {
static func ==(lhs: User, rhs: User) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
}
そうすると、testUser()
メソッドがテストでき、成功になりました!(やったね)
まとめ
自作構造体でもEquatable
に準拠させることで比較することができま...したが、自作構造体をプロジェクトで使うときもEquatable
が使えてしまいます。
そこで、テストの時だけ、自作構造体をEquatable
に準拠させたいと思います。
自作構造体の比較(テストの時だけ)
struct User {
let name: String
let age: Int
}
まずは、自作構造体を作ります
そして、テスト書きます
func testUser() {
let expected = User(name: "foo", age: 10)
let actual = User(name: "foo", age: 10)
XCTAssertEqual(expected, actual)
}
そして、自作構造体をEquatable
に準拠させるのですが、user.swift
ではなくMyTests.swift
に書きます
class MyTests: XCTestCase {
func testUser() {
let expected = User(name: "foo", age: 10)
let actual = User(name: "foo", age: 10)
XCTAssertEqual(expected, actual)
}
}
extension User: Equatable {
static func ==(lhs: User, rhs: User) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
}
このようになり、XCTAssertEqual
で自作構造体が使えるようになりました。
ここにEquatable
の準拠を書くことで、プロジェクト側は自作構造体がEquatable
に準拠してない状態で使えます
試しにプロジェクト側でEquatable
を使ってみます。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let user = User(name: "foo", age: 10)
let user2 = User(name: "foo", age: 10)
if user == user2 { //Binary operator '==' cannot be applied to two 'User' operands
print("ok")
}
}
}
自作構造体の比較をしているところで、Binary operator '==' cannot be applied to two 'User' operands
というエラーがでます。
つまり、テストでは使えるのに、プロジェクトでは使えないという目的を果たしました
真・まとめ
テストだけで、比較がしたかったり、なにかしたい場合があった時に、テストの方にextensionで拡張をすると、プロジェクトの方には反映されないことがわかりました。
これでみなさんのテストが捗ることを祈っております。