2

XCTest と OCMock 2.2.1 を使用して単体テストに取り組んでいます。以下を使用してバンドル識別子を取得するクラスがあります。

NSString *bundleIdentifier = [[NSBundle bundleForClass:[self class]] bundleIdentifier];

これは、特にこのクラスのアプリケーションまたは単体テストの実行中に期待どおりに機能します。

他のクラスでテストを行っている間、私はこのオブジェクトを部分的にモックしていますが、バンドル識別子を取得するメソッドを実行する必要があります。

私が見ているのは、オブジェクトのインスタンスを+ [OCMockObject partialMockForObject:]正しく見えるように渡す前です:

(lldb) po myObject
<MyObject: 0x1006ec480>
(lldb) po [NSBundle bundleForClass:[myObject class]]
NSBundle </Users/paynerc/Library/Developer/Xcode/DerivedData/xxxx/Build/Products/Debug/MyTests Tests.xctest> (loaded)
(lldb) po [[NSBundle bundleForClass:[myObject class]] bundleIdentifier]
com.paynerc.MyBundle

ただし、 に渡すと、状況が変わりますmyObject[OCMockObject partialMockForObject:myObject]

(lldb) po myObject
<MyObject-0x1006ec480-401894396.880136: 0x1006ec480>
(lldb) po [NSBundle bundleForClass:[myObject class]]
NSBundle </Applications/Xcode.app/Contents/Developer/usr/bin> (loaded)
(lldb) po [[NSBundle bundleForClass:[myObject class]] bundleIdentifier]
nil

オブジェクトが変更され、部分的なモック マジックが含まれているという事実は理にかなっています。意味がないように思われるのは、 への呼び出しがbundleForClass返す内容を変更した理由です。

bundleForClassMyObject内の呼び出しをモックする以外に、元の値を返し続けることを保証するためにできることはありますか? ここで懸念されるのは、別の単体テストで MyObject の部分的なモックを必要とする他の誰かが、 のスタブ実装を提供することを覚えておく必要があるということですbundleForClass

私の現在の解決策は、バンドル識別子を要求して結果を調べることです。nil の場合、nil 以外の bundleIdentifier を持つものが見つかるまで、それらを呼び出し[NSBundle allBundles]て繰り返します。それは現在...動作していますが... A)あまり堅牢ではありません B)恐ろしくブルートフォースっぽい そして C)単体テストをサポートするためにアプリケーションコードを変更します。

他の誰かがこれに遭遇し、より良い解決策を思いつきましたか?

4

1 に答える 1