タグ

ブックマーク / blog.ishkawa.org (16)

  • テストの準備の失敗をテストの失敗として扱う

    Mar 11, 2017 ユニットテストを書くときに、fixtureを読み込むなどの何らかの準備をすることがあります。そして、こういった処理もテスト対象の処理と同様に失敗する可能性があります。失敗を素直に表すならば、メソッドにthrowsをつけてエラーを投げられるようにします。 enum JSONFixture: String { struct FileNotFoundError: Error {} case foo case bar case baz func loadJSON() throws -> Any { let bundle = Bundle(for: TestBundleClass.self) guard let path = bundle.path(forResource: rawValue, ofType: "json") else { throw FileNotFoun

    テストの準備の失敗をテストの失敗として扱う
    tasanobu
    tasanobu 2017/03/12
  • antitypical/Resultの良いところ

    また、元のコードのvalue, errorは両方ともOptionalなので、以下の4つの組み合わせが存在します。 None, None None, Some Some, None Some, Some 元のコードは(None, None)と(Some, Some)を考慮していません。 つまり、実行時には(None, Some)と(Some, None)の2パターンしか存在しないという約束を前提としたコードとなっています。 Resultを利用するとそのような約束を型で表すことができ、2パターンしか存在しないことがコンパイル時に保証されるようになります。 Cocoaの伝統的なメソッドに対してもResultを使用できます。

    antitypical/Resultの良いところ
    tasanobu
    tasanobu 2015/05/08
    antitypical/Resultの良いところ
  • Swiftのmanual mocking

    Mar 20, 2015 Objective-Cではテストケース毎にオブジェクトの一部だけ挙動を変えたい場合に、OCMockなどのライブラリを使うのが普通でした。 それらのライブラリはNSInvocationやMethod Swizzlingなどを使ったいわゆる魔術的なコードで実現されていることが多く、 “テストコードを書いているのによくわからんコードが動いてる!”ってなってモヤモヤしたりします。 一方、Swiftではmanual mockingという手法が取られたりするみたいです。 例えば、 class Object { var foo: String { return "foo" } var bar: String { return "bar" } } class ObjectTests: XCTestCase { func testFoo() { class ObjectMock:

    Swiftのmanual mocking
  • agvtool+Jenkinsでビルド番号付きipaを作成

    Oct 19, 2014 iTunes Connectがアップデートされてから、1つのアプリのバージョンに対して複数のipaをアップロードできるようになりました。 しかし、ビルド番号が重複しているとエラーが発生してしまうので、ビルド番号をインクリメントしていく必要があります。 手動でビルド番号をインクリメントしてリポジトリにコミットしていくと、分散管理では矛盾が生じてしまうので、 ビルド番号にはJenkinsのビルド番号を指定し、リポジトリにはコミットしないことにしてみました。 セットアップ Jenkinsでxcodebuildを実行する前に以下のコマンドを実行するだけです。 自分はJenkinsにアドホック配布用のipaとAppStore用のipaの両方を作成させていて、 AdHoc配布用のipaをTestFlightにアップロードし、AppStore用のipaはビルド成果物として保存し

    agvtool+Jenkinsでビルド番号付きipaを作成
    tasanobu
    tasanobu 2015/03/01
    iTunes Connectにipaをアップする際のビルド番号の採番方法。 Jenkinsのビルド番号を使い、レポジトリで管理しないって運用は良さげ
  • Swiftで書いたコマンドラインツールをHomebrewでインストールできるようにする

    Feb 18, 2015 toolという名前のコマンドラインツールをつくるとします。 Makefile ビルドターゲットのINSTALL_PATHは/usr/local/binとします。 DSTROOT=/tmp/tool.dst prefix_install: xcodebuild install -scheme tool DSTROOT=$(DSTROOT) mkdir -p $(PREFIX)/bin cp -f $(DSTROOT)/usr/local/bin/tool $(PREFIX)/bin/ class Tool < Formula homepage "https://github.com/yourname/tool" version "0.0.1" sha1 "0123456789abcdef0123456789abcdef01234567" url "https://g

    Swiftで書いたコマンドラインツールをHomebrewでインストールできるようにする
  • ls2xsでLocalizable.stringsからStoryboardの.stringsを自動生成する

    Feb 17, 2015 iOS 6あたりからxib, storyboardの文字列ベースのローカライズを可能とするBase Internationalizationが導入されましたが、 xib, storyboardの.stringsのキーは”4gA-LI-pd8.title”といった謎のオブジェクトIDとなっており、メンテナンスしていくのがなかなか大変なものでした。 それに対してコード上では、NSLocalizedString("key", "comment")といった形式で予めLocalizable.stringsに自分で設定したキーを使用することができました。 xib, storyboardでもコードと同じようにLocalizable.stringsを利用できるように、ls2xsというツールをつくりました。 https://github.com/ishkawa/ls2xs インスト

    ls2xsでLocalizable.stringsからStoryboardの.stringsを自動生成する
    tasanobu
    tasanobu 2015/02/18
    ls2xsでLocalizable.stringsからStoryboardの.stringsを自動生成する
  • Carthage: Swift対応の新しいライブラリ管理

    Nov 20, 2014 iOS, OSXで利用できるライブラリ管理ツールといえばCocoaPodsが有名ですが、 それとはまた違った方針のCarthageというライブラリ管理ツールがリリースされました。 GitHubのデベロッパーを中心としたチームで開発が進められているようです。 https://github.com/Carthage/Carthage インストール方法 Releasesからpkgをダウンロードして、インストーラーを実行します。 使い方 Cartfileを書く carthage updateを実行する Carthage.buildに作成された.frameworkをXcodeに追加する Cartfileではgithub, gitの2種類のキーワードが利用でき、以下のように書きます。 サポート対象 Carthageはdynamic frameworkのみをサポートするため、C

    Carthage: Swift対応の新しいライブラリ管理
  • iOS開発でGitを利用する際のTips - blog.ishkawa.org

    ちょっと今更な感じもありますが、iOS開発でGitを使うときのTipsを紹介します。 Gitそのものの使い方は理解している前提のもとで書きます。 バージョン管理する対象 Xcodeのプロジェクトにはバージョン管理する上で結構余計なものが入っています。 Gitで管理すべきでないもの Xcodeの作業データ Xcodeのプロジェクトは.xcodeprojですが、こいつ自身はディレクトリになっていて project.pbxproj project.xcworkspace xcuserdata というファイルが入っています。このうち、Gitで管理するべきものはproject.pbxprojです。 その他のものはXcodeの状態(グループを開いてるかなど)を管理しているものなので、 プロジェクトのバージョン管理対象としては適切ではありません。 ビルドデータ xcodebuildコマンドを実

  • すべてのテストケースの前後にあれこれする

    iOSのアプリケーションテストを書いていると、各テストケースの前後に永続ストアやスタブサーバーなどをリセットしたくなることがあると思います。 リセットが必要なテストスイートのsetUp/tearDownに書いても良いのですが、書くのが面倒だったり書き忘れてしまうこともあるので、 すべてのテストケースについてリセットが走るようにしておいた方が心を穏やかにすることができると思います。 実現方法 すぐに思いついたのは以下のような方法です。 setUp/tearDownにリセット処理を加えたサブクラスを継承させる XCTestCaseのsetUp/tearDownをswizzleする サブクラスを継承させる方法には、KIFTestCaseなど他のライブラリのクラスには適用ができないという問題があります。 method swizzlingを利用する方法は、他のmethod swizzlingと衝突す

    tasanobu
    tasanobu 2014/04/30
    XCTestObserverってクラスあるんだ。サブクラス作って初期化処理をするってのは確かに便利だな
  • xcodebuildのログをxcprettyで整える

    Xcode 5になってからxcodebuildも進化していて、Xcode 4までネックになっていたApplication Testsの実行も簡単になりました。 そういうわけで自分にとってのxctoolの必要性は薄まり、あとはログさえキレイになってくれればいいのになあと思っていたのですが、そんなときにxcprettyが登場しました。 mneorr/XCPretty xctoolとの違い xctoolはxcodebuildを置き換えることを目的としていましたが、xcprettyはxcodebuildと共存してログの整形のみを行います。 xctoolの場合、”xcodebuildでは動くけどxctoolでは動かない”という状況に遭遇することがありますが、 xcprettyはビルドやテストの実行自体にxcodebuildを利用するので、既にxcodebuildで進んでいるプロジェクトでは簡単に利用

  • iOS6(ARC)でのGCDのメモリ管理 - blog.ishkawa.org

    Deployment TargetがiOS6.0以上の場合、GCDのオブジェクトもARCの管轄下になるらしいです。   以下のStack Overflowによると<os/object.h>というヘッダに書かれているそうです。 Why is ARC complaining about dispatch_queue_create and dispatch_release in iOS 6? これが適用される場合にはdispatch_releaseなどに対してXcodeが警告を出してくれます。 で、GCDのオブジェクトをプロパティとして持つ場合にどうしたらいいのか、 ちょっと迷ったので、dispatch_semaphore_tを例に書いておきます。 Deployment Targetが6.0未満の場合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

  • #confwd でOSSでのObjective-Cの書き方について話してきた

    Conference With Developers 2 | Peatix 自分はiOSデベロッパーとして大した経験や実績があるわけではないのですが、 公開しているライブラリの数はかなり多い方のなので、そこで得られた知識を話そうと思いました。 トーク中は聴いている人のリアクションを気にする余裕もなかったのですが、 あとからTwitterのタイムラインを読んでみると、良い反応をしてくれている方もいたようで嬉しかったです。 今回の発表ではどのトピックも詳細に立ち入ることが難しかったので、いつか文章でしっかりとまとめられるといいなと思いました。 トークの準備 大勢の前で45分も話し続けるのは初めてだったので、どうやって準備したらいいものか悩みました。 スライドをつくりながらトークの内容を練るのは難しそうだったので、はじめはmarkdownで適当な文章を書いて、 そこからの大事な単語や文を拾ってき

  • iOSシミュレータの日本語フォントが変になるのを防ぐ

    iOSシミュレータの日フォントが変になっちゃったときの対処法 – らっこのじゆうちょう こちらの記事にある通り、日語よりも中国語が優先されていると日語のフォントがおかしくなってしまうのですが、設定画面から日語に設定し直すのはちょっとだけ面倒です。 Arguments Passes On Launchに以下の値を設定しておくと、必ず日語に設定された状態でアプリが立ち上がるので、付き合いが長いプロジェクトでは設定しておくと楽かもしれません。 1 -AppleLanguages (ja) 参考: iOS – Launch Arguments を使った一つ上の NSLocalizedString – Qiita

    iOSシミュレータの日本語フォントが変になるのを防ぐ
  • XCTest + iOS 7でCoverallsを利用する

    XCTest + iOS7でテストを実行しても上手くコードカバレッジが取得できずに困っていたのですが、 最近@tokoromさんが取得できる方法を紹介していたので、 そちらを参考にして対応してみました。資料は以下のものです。 My unit test environment for Objective-C Coverallsに対応したライブラリは以下のものです。 ISHTTPOperation ISDiskCache ISMemoryCache NSRunLoop+PerformBlock 対応の肝となるのはISGcovFlusherをテストターゲットに追加しておくことです。 これを追加することでテスト終了時に__gcov_flush()を自動的に呼んでくれて*.gcdaが出力されるようになります。 なお、__gcov_flush()を呼び出すにはBuild Settingsの”Instr

  • JSONにNSNullが入ってきたとき

    多くのiOSアプリはサーバーとの通信が必要で、やりとりされるデータのフォーマットにはJSONが採用されることが多いと思います。 iOS 5からは標準ライブラリにNSJSONSerializationが導入され、特に理由がなければJSONのエンコード/デコードにはこれを利用します。 NSJSONSerializationが扱うオブジェクトは以下の5種類のオブジェクトです。 NSString NSNumber NSArray NSDictionary NSNull そこで心配になるのが、予期しないところにNSNullが入ってきて”unrecognized selector sent to instance.“となってしまうことです。 NSNullではなくてnilが入っていてほしいと考える人は多いようですが、そもそもNSArrayやNSDictonaryはnilを含むことはできず、 そのような状

  • iOS5で動作するUIRefreshControlのライブラリをつくったときの話 - blog.ishkawa.org

    先日、iOS5でも動作するUIRefreshControlと銘打ったISRefreshControlというライブラリを公開しました。 今回はISRefreshControlでやっていることについて、簡単に解説したいと思います。 詳細には踏み入らずにアイディアとコアのコードだけを書きますので、 アプリに組み込む場合にはGitHubに上がっているものを利用することをおすすめします。 ISRefreshControl – 基方針 iOS6: 物のUIRefreshControlとして動作する。 iOS5: UIRefreshControlの真似をする。 使い方 UIRefreshControlと概ね同じ使い方ができます。 1 2 3 4 5 6 UIScrollView *scrollView = [[UIScrollView alloc] init]; ISRefreshControl *

  • 1