Slide 1

Slide 1 text

Quick + LensΛ༻͍ͨ ςετͷߏ଄Խ

Slide 2

Slide 2 text

ࣗݾ঺հ • Takeshi Ihara / @nonchalant0303 • Recruit Marketing Partners • iOS Engineer

Slide 3

Slide 3 text

Quick is a behavior-driven development framework for Swift and Objective-C. Inspired by RSpec, Specta, and Ginkgo.

Slide 4

Slide 4 text

import Quick import Nimble class TableOfContentsSpec: QuickSpec { override func spec() { describe("the 'Documentation' directory") { it("has everything you need to get started") { let sections = Directory("Documentation").sections expect(sections).to( contain( "Organized Tests with Quick Examples and Example Groups" ) ) expect(sections).to(contain("Installing Quick")) } context("if it doesn't have what you're looking for") { it("needs to be updated") { let you = You(awesome: true) expect{you.submittedAnIssue}.toEventually(beTruthy()) } } } } }

Slide 5

Slide 5 text

• describe • ςετέʔεͷάϧʔϐϯάͷͨΊͷϝιου • context • describeͱಉ༷ • ςετΛཧղ͠΍͘͢͢ΔͨΊʹ࢖͍෼͚Δ • it • ίʔυ͕ͲͷΑ͏ʹಈ࡞͢΂͖͔Λએݴ͢Δϝιου • XCTest ͷ test methods ͷΑ͏ͳ΋ͷ • beforeEach, afterEach • ֤ςετ͕࢝·Δલ/ऴΘͬͨޙʹ࣮ߦ͞ΕΔϝιου • XCTest ͷ setUp, tearDown ͷΑ͏ͳ΋ͷ

Slide 6

Slide 6 text

͡Ό࣮͋ࡍͲ͏΍ͬͯॻ͘ͷ͔

Slide 7

Slide 7 text

struct User { let name: String let age: Int let sns: SNS var isStudent: Bool { return age >= 6 && age <= 15 } } struct SNS { let twitter: String? let github: String? }

Slide 8

Slide 8 text

struct User { let name: String let age: Int let sns: SNS var isStudent: Bool { return age >= 6 && age <= 15 } } struct SNS { let twitter: String? let github: String? }

Slide 9

Slide 9 text

class UserSpec: QuickSpec { override func spec() { describe("User") { var user: User! beforeEach { user = User(name: "Takeshi Ihara", age: 24, sns: SNS(twitter: nil, github: nil)) } describe("isStudent") { context("when age is 13") { beforeEach { user = User(name: "name", age: 13, sns: SNS(twitter: nil, github: nil)) } it("user is student") { expect(user.isStudent).to(beTrue()) } } context("when age is 5") { beforeEach { user = User(name: "name", age: 5, sns: SNS(twitter: nil, github: nil)) } it("user is not student") { expect(user.isStudent).to(beFalse()) } } context("when age is 17") { ... } } } } }

Slide 10

Slide 10 text

class UserSpec: QuickSpec { override func spec() { describe("User") { var user: User! beforeEach { user = User(name: "Takeshi Ihara", age: 24, sns: SNS(twitter: nil, github: nil)) } describe("isStudent") { context("when age is 13") { beforeEach { user = User(name: "name", age: 13, sns: SNS(twitter: nil, github: nil)) } it("user is student") { expect(user.isStudent).to(beTrue()) } } context("when age is 5") { beforeEach { user = User(name: "name", age: 5, sns: SNS(twitter: nil, github: nil)) } it("user is not student") { expect(user.isStudent).to(beFalse()) } } context("when age is 17") { ... } } } } } ςετର৅ લఏͷঢ়گ ظ଴͢Δ݁Ռ લఏͷঢ়گͷ࣮૷

Slide 11

Slide 11 text

͜͜·Ͱ͸QuickΛ༻͍ͨ ςετͷߏ଄Խͷ࿩

Slide 12

Slide 12 text

beforeEach context("when age is 13") { beforeEach { user = User( name: "name", age: 13, sns: SNS(twitter: nil, github: nil) ) } it("user is student") { expect(user.isStudent).to(beTrue()) } } ςετͷલఏঢ়گ͕ෆ໌֬

Slide 13

Slide 13 text

Lens • ෆมੑΛอͪͭͭωετͨ͠σʔλߏ଄ʹର͢ΔΞΫηεΛLensͷ߹ ੒ͰදݱͰ͖ΔΑ͏ʹͨ͠΋ͷ • ݩʑ͸Haskell, Scalaͷ֓೦ • SwiftzͷLens࣮૷Λಠཱͨ͠ϑϨʔϜϫʔΫͱͯ͠੾Γग़ͨ͠ Focusͱ͍͏ϑϨʔϜϫʔΫ΋ଘࡏ

Slide 15

Slide 15 text

extension User { static var _name: Lens { return Lens( getter: { $0.name }, setter: { User(name: $1, age: $0.age, sns: $0.sns) } ) } static var _age: Lens { return Lens( getter: { $0.age }, setter: { User(name: $0.name, age: $1, sns: $0.sns) } ) } static var _sns: Lens { return Lens( getter: { $0.sns }, setter: { User(name: $0.name, age: $0.age, sns: $1) } ) } }

Slide 16

Slide 16 text

class UserSpec: QuickSpec { override func spec() { describe("User") { var user: User! beforeEach { user = User(name: "Takeshi Ihara", age: 24, sns: SNS(twitter: nil, github: nil)) } describe("isStudent") { context("when age is 13") { beforeEach { user = User._age.set(user, 13) } it("user is student") { expect(user.isStudent).to(beTrue()) } } context("when age is 5") { beforeEach { user = User(name: "name", age: 5, sns: SNS(twitter: nil, github: nil)) } it("user is not student") { expect(user.isStudent).to(beFalse()) } } context("when age is 17") { ... } } } } } ςετʹؔ܎͢ΔQSPQFSUZ͚ͩ ઃఆͰ͖Δ

Slide 17

Slide 17 text

·ͱΊ • QuickΛ༻͍ͯςετͷߏ଄ԽΛ࣮ݱͨ͠ • Lensͷ֓೦Λ༻͍ͯ, ςετͷલఏঢ়گͷ ࣮૷Λ໌֬ʹͨ͠