読者です 読者をやめる 読者になる 読者になる

OCMockをApplication Testで使う

iOS Testing

最初この記事を見てstatic libraryではなく、OCMock.frameworkを使う方法を試していたのだが、この方法ではApplication Testではうまくいかない。

OCMockのWebサイトに書かれている通り、static libraryを使う必要がある。これを見落としていて3時間くらい悩んだ。

To use the library in an iOS project, you have to make the actual library, ie. libOCMock.a, as well as the header files available to the project containing the tests. One way of achieving this is to copy the library and headers into a directory named "Libraries" in the project directory (this does not exist by default) and then adding the following flags to the project:

HEADER_SEARCH_PATHS = $(PROJECT_DIR)/Libraries/Headers
LIBRARY_SEARCH_PATHS = $(inherited) "$(PROJECT_DIR)/Libraries"
Due to some issues, which are described in this Apple Technical Q&A, you also have to add the following flags:

OTHER_LDFLAGS = -ObjC -force_load $(PROJECT_DIR)/Libraries/libOCMock.a

If you have copied the library or headers to a different place all of these settings must be adjusted accordingly.

http://www.mulle-kybernetik.com/software/OCMock/#ios

どういう風にstatic libraryを自分のプロジェクトに取り込むかも悩みどころだが、上の引用にある通り、プロジェクト直下ディレクトリにLibrariesというディレクトリをつくり、その下にOCMockの配布物からHeadersとlibOCMock.aをコピーして置くことにした。

.
├── Libraries
│ ├── Headers
│ │ └── OCMock
│ └── libOCMock.a
├── MyProject
│ ├── en.lproj
│ └── main.m
├── OCMockTesting.xcodeproj
└── MyProjectTests
    ├── MyGreatestTests.h
    ├── MyGreatestTests.m
    └── en.lproj

検索すると「OCMockのレポジトリからtrunkのコードをチェックアウトしてビルドしろ」というような解決策がかなり出てくるが、OCMockのサイトで配布されているocmock-1.77.dmgに含まれているRelease/Library/libOCMock.aをそのまま使っても特に問題を感じなかった。すでに1.77というバージョンでは問題が解決しているようなので、情報が古いのかもしれない。