26

OCMock スタブにandReturnValueを初めて追加したとき、その戻り値は石に設定されているようです。例えば:

id physics = [OCMockObject niceMockForClass:[DynamicPhysicsComponent class]
Entity *testEntity = [Entity entityWithPhysicsComponent:physics];
CGPoint velocity1 = CGPointMake(100, 100);
CGPoint velocity2 = CGPointZero;
[[[physics stub] andReturnValue:OCMOCK_VALUE(velocity1)] getCurrentVelocity];
[testEntity update:0.1];
[[[physics stub] andReturnValue:OCMOCK_VALUE(velocity2)] getCurrentVelocity];
[testEntity update:0.1];

スタブ化されたメソッドは [testEntity update] で呼び出されます。しかし、スタブ化されたメソッドがvelocity1値を返すたびに、メソッドの戻り値を設定する2回目の試みは尊重されないと思います.

OCMock でこれを行う方法はありますか?

4

4 に答える 4

38

メソッドの場合stub、何回呼び出されても、常に指定された方法で機能する必要があると言っています。これを修正する最も簡単な方法は、次のように変更stubすることexpectです。

CGPoint velocity1 = CGPointMake(100, 100);
CGPoint velocity2 = CGPointZero;
[[[physics expect] andReturnValue:OCMOCK_VALUE(velocity1)] getCurrentVelocity];
[testEntity update:0.1];
[[[physics expect] andReturnValue:OCMOCK_VALUE(velocity2)] getCurrentVelocity];
[testEntity update:0.1];

または、必要に応じてstub(たとえば、メソッドがまったく呼び出されない場合など)、モックを再作成できます。

CGPoint velocity1 = CGPointMake(100, 100);
CGPoint velocity2 = CGPointZero;
[[[physics stub] andReturnValue:OCMOCK_VALUE(velocity1)] getCurrentVelocity];
[testEntity update:0.1];
[physics verify];

physics = [OCMockObject mockForClass:[Physics class]];
[[[physics stub] andReturnValue:OCMOCK_VALUE(velocity2)] getCurrentVelocity];
[testEntity update:0.1];
[physics verify];
于 2011-04-14T16:56:13.840 に答える
28

実際には、またはstubを使用する場合、戻り値を石で設定するだけです。このメソッドを使用して、いつでも戻り値を変更できます。これは、メソッドが呼び出される回数を知る必要がある場合の改善です。これを実現するためのコード スニペットは次のとおりです。andReturnandReturnValueandDoexpect

__weak TestClass *weakSelf = self;
[[[physics stub] andDo:^(NSInvocation *invocation) {
    NSValue *result = [NSValue valueWithCGPoint:weakSelf.currentVelocity];
    [invocation setReturnValue:&result];
}] getCurrentVelocity];
于 2012-11-02T14:20:20.640 に答える
2

CipherCom には正しい答えがあると思いますが、さまざまな値を返すためのヘルパー クラスを作成することを好みます。過去に問題がありNSInvocationました。

@interface TestHelper : NSObject
@property (nonatomic, assign) CGPoint velocity;
- (CGPoint)getCurrentVelocity;
@end

@implementation TestHelper
- (CGPoint)getCurrentVelocity
{
    return self.velocity;
}
@end

次に、テストクラスでプライベートメンバー変数を使用TestHelperし、setUpメソッドで次のようにします。

self.testHelper = [TestHelper new];

[[[physics stub] andCall:@selector(getCurrentVelocity) onObject:self.testHelper]
                 getCurrentVelocity]; 

そうすれば、各テストで速度をテストに必要な速度に設定できます。

self.testHelper.velocity = CGPointMake(100, 200);

于 2015-03-16T16:59:43.630 に答える