2

失敗している次の単体テストがあります。OCMock複数のスレッドでうまく機能しないためだと思いますが、間違っている可能性があります。mockTestMethodA呼び出されることはありません。testMethodA同じスレッド(なしNSThread)でを呼び出すようにコードを変更した場合、スタブは機能しているようです。これは既知の制限ですか、OCMockそれとも何かが足りませんか?

サンプルコード:

- (void) testCallMethodUsingNSThreadFromADifferentClass
{
   mockTestClassA = [OCMockObject partialMockForObject:testClassA];

   [[[mockTestClassA expect] andCall:@selector(mockTestMethodA) onObject:self] testMethodA];

   [testClassC threadedRequestToCallMethodA];

   [self waitForCompletion:5.0];

   [mockTestClassA verify];
}

threadedRequestToCallMethodAおよびcallMethodAFromTestClassCinTestClassCは次のように定義されます。

- (void) threadedRequestToCallMethodA
{
    [NSThread detachNewThreadSelector:@selector(callMethodAFromTestClassC) toTarget:self withObject:nil];
}

- (void) callMethodAFromTestClassC
{
    [[[TestClassA alloc] init] testMethodA];
}

testMethodAinTestClassAは次のように定義されます。

- (void) testMethodA
{
    NSLog(@"testMethodA");
}

スタブメソッドは次のように定義されます。

- (void) mockTestMethodA
{
   NSLog(@"mockTestMethodA");
}

そして最後にwaitForCompletion

- (BOOL) waitForCompletion:(NSTimeInterval)timeoutSecs
{
    NSDate  *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeoutSecs];
    do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeoutDate];
        if([timeoutDate timeIntervalSinceNow] < 0.0)
        break;
    } while (!done);

   return done;
 }

あなたの助けに感謝します。

ありがとう。

4

1 に答える 1

0

問題は、部分的にモックしたオブジェクトでテストメソッドを呼び出しておらず、代わりに新しいオブジェクトを割り当てていることcallMethodAFromTestClassCです。適切なオブジェクトで呼び出すと、正常に機能します。以下を参照してください(実際には別のクラスCを作成しませんが、効果は同じです)。ちなみに、ブロックとGCDは生活を楽にしてくれると思いますが、誰もが独自のスタイルを持っています。

//
//  TestClassTest.m
//  TestApp
//
//  Created by Benjamin Flynn on 11/20/12.
//

#import <SenTestingKit/SenTestingKit.h>
#import "OCMock.h"
#import "TestClassA.h"

@interface TestClassTest : SenTestCase

@property (nonatomic, retain) TestClassA *testClassA;
@property (atomic, assign) BOOL done;
@end


@implementation TestClassTest

- (void) testCallMethodUsingNSThreadFromADifferentClass
{
    self.testClassA = [[TestClassA alloc] init];
    id mockTestClassA = [OCMockObject partialMockForObject:self.testClassA];
    [[[mockTestClassA expect] andCall:@selector(mockTestMethodA) onObject:self] testMethodA];
    [self threadedRequestToCallMethodA];
    [self waitForCompletion:5.0];    
    [mockTestClassA verify];
}

- (void)threadedRequestToCallMethodA
{
    [NSThread detachNewThreadSelector:@selector(callMethodAFromTestClassC) toTarget:self withObject:nil];
}


- (void)callMethodAFromTestClassC
{
    [self.testClassA testMethodA];
}

- (void)mockTestMethodA
{
    NSLog(@"Mock test method A");
    self.done = YES;
}

- (BOOL)waitForCompletion:(NSTimeInterval)timeoutSecs
{
    NSDate  *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeoutSecs];
    NSLog(@"Starting timer");
    do {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeoutDate];
        if([timeoutDate timeIntervalSinceNow] < 0.0)
            break;
    } while (!self.done);
    NSLog(@"Ending timer");

    return self.done;
}

@end
于 2013-04-19T16:26:30.900 に答える