9

私は、コア ロジックがプライベート メソッドにある多くの状況に遭遇しました。未知の/プライベートメソッドのコンパイルエラーを無視するためのコンパイル時の操作はありますか? コードの 2 番目の部分で performSelector を使用できることはわかっていますが、それは妥当な解決策でしょうか?

例えば:

[[self.objectMock expect] privateMethod];
or 
[self.object callPrivateMethodsToExpectSomeOtherBehaviour]

編集:

いくつかのプライベート メソッドをテストする必要があると感じる理由を示す例を次に示します。これらのテストは合理的ではありませんか? clear を呼び出すと、実際にそれが想定していることを実際に実行することをテストするには、他にどのようにすればよいでしょうか?

- (void)clear
{
   self.orderNumber = nil;
   [self.items removeAllObjects];
   // Clear the rest of fields
}

- (void)testClearShouldRemoveOrderNumber
{
   Order *order = [[Order alloc] init];
   OCMockObject *orderPartialMock = [OCmockObject partialMockForObject:order];

   [[orderPartialMock.items expect] setOrderNumber:nil];
   [orderPartialMock clear];
   [orderPartialMock verify];
}

- (void)testClearShouldRemoveItems
{
    Order *order = [[Order alloc] init];
    order.items = [[OCMockObject niceMockForClass:[NSMutableArray class]];

    [[orderPartialMock.items expect] removeAllObjects];
    [orderPartialMock performSelector@selector(clear)];
    [orderPartialMock.items verify];
}
4

4 に答える 4

9

プライベート メソッドを直接テストしないでください。代わりに、パブリック メソッドを使用してテストする必要があります。問題を議論しているprogrammers.stackexchange.comの質問へのリンクです。

答えの一般的な考え方は、あなた (またはあなたのコードを維持している他の人) は、署名を変更したり、実装を変更したり、それらを完全に削除したりして、いつでもプライベート メソッドを自由に変更できるべきだということです。クラス外の誰も気にする必要はありません。結局のところ、それがこれらのメソッドを非公開にする主な理由です。

互換性のない方法でプライベート メソッドを変更すると、パブリック メソッドの単体テストが壊れる必要があります。そうしないと、パブリック メソッドのテストがうまくできていません。事実上、これによりプライベート メソッドの単体テストが不要になります。

于 2012-09-10T14:37:27.430 に答える
5

一般に、プライベート メソッドを単体テストする必要はありません。

公に公開されたメソッドは、クラスが何をするかを教えてくれます。これはあなたが気にしていることであり、これらをテストする必要があります。プライベート メソッドは、クラスがどのようにジョブを実行するかに関係しています。テストは、ジョブが正しく実行される限り、ジョブがどのように実行されるかを気にする必要はありません。

ある日、クラスの実際の動作を変更せずに、クラスの動作方法を変更することにした場合 (つまり、プライベート メソッドのコードを変更することによって)、ユニット テストは引き続きパスするはずです。クラスの内部をテストしようとすると、クラスがまだ正しく機能していても壊れる可能性のある脆弱なテストが作成されます。

パブリック メソッドを使用するだけでクラスを完全にテストするのが難しい場合は、クラスが大きすぎる可能性があるという警告サインです。クラスをより小さな部分に分割することを検討してください。

于 2012-09-10T14:36:36.320 に答える
0

これらを単体テストする必要はありません - 実際、すべきではありません。
public メソッドを介して間接的に private メソッドをテストします。プライベート メソッドは、パブリック メソッドを処理するためのヘルパー メソッドです。

単体テストが好きなようにプライベートメソッドを自由に変更できるようにする必要があるため、非生産的でもあります。

ただし、すべてのプライベート メソッドがカバーされるように、必ずパブリック メソッドのすべてのケースをテストしてください。

于 2012-09-10T14:44:23.977 に答える