1

単体テストの実行がコードの通常の実行とは異なる動作をしているという奇妙な状況に遭遇しています。

特に、JSONModel というライブラリを使用しており、JSON 文字列からオブジェクトを逆シリアル化しようとしているときに、実行中のテスト ケースをステップ実行するときに、特に 1 つの行が問題を引き起こしています。

if ( [[property.type class] isSubclassOfClass:[JSONModel class]] ) ...

この行の前 (または後) にブレークポイントを置いて実行すると:

expr [[property.type class] isSubclassOfClass:[JSONModel class]]

...デバッガーでは\x01、値 (つまり true) として出力されますが、実際に命令ポインターをステップ実行すると、false のように動作し、代わりに else ブロックに入ります。もう一度、式をデバッガーに再度入力すると、それでも true として表示されます。

誰かが以前に同様の動作を見たことがあり、何が間違っている可能性があるかについて何か提案があるかどうか興味があります. Xcode にテスト用の内部ココア クラスの実装が異なる場合を除き、別の定義を含めていないことは確かです。

更新:さらに奇妙な証拠がいくつかあります:NSLog実行がどのように物事を見ているかを理解するために、いくつかのステートメントを追加しました。ログインするproperty.type.superclassと、JSONModel(予想どおり)戻ってきます。ただし、ログproperty.type.superclass == [JSONModel class]に記録するとfalse!

私にとって、これは、単体テストの実行が見ている JSONModel が、実行時に見ている別の JSONModel クラスであることを示しています (そして、それが見るべきもの)。しかし、それがどのように起こっているのか、私にはわかりません。

これは、前方クラス宣言などによって引き起こされる可能性がありますか?

4

2 に答える 2

3

さて、私は実験によって「解決策」を発見したようです。[JSONModel class]付け替えたらスパッとNSClassFromString(@"JSONModel")動くことが判明!

これがなぜなのか、私には言えません。説明できる人なら誰でも答えます。

于 2014-01-28T02:15:48.657 に答える
0

私はまったく同じ問題を抱えていました。これが起こっていたことです。

この種の動作で予想されたのは、クラスが重複しているという問題でした。あなた[instance class]と同じように、NSClassFromString異なる値を返します。ただし、クラスはすべての点で同一でした:同じivar、同じメソッド(objランタイムでチェック)。コンパイル、リンク、および/または実行時に警告が表示されませんでした

私の場合、テストはメイン アプリケーション (Bar.app) で使用される静的ライブラリに関するものでした。

基本的に、私は3つのターゲットを持っていました:

  • libFoo
  • libFooTests
  • Bar.app

テストは、シミュレーターではなく、デバイスで実行されていました。そのため、ユニット テストではなくロジック テストである必要があり、アプリケーションにロードする必要がありました。バンドル ローダーは、私のメイン アプリでした。追加のリンカー フラグのみがBar.app-ObjC

今、Bar.appリンクしてlibFooいました。また、libFooTestsリンクしていたことがわかりましたlibFoolibFooTestsテスト ホスト ( ) に注入するとBar.app、シンボルが複製されましたが、警告は表示されませんでした。これが、この特定のクラスが複製された方法です。

libFooリンクするライブラリのリストから削除するだけでlibFooTestsうまくいきました。

于 2015-03-18T20:14:35.600 に答える