2013-03-01 4 views
12

Übergeben eines OCMock-Objekts an eine Methode, bei der die Funktion isKindOfClass aufruft. Beim Komponententest ist der zurückgegebene Wert jedoch nicht der Mocked-Klasse, aber OCMockObjectWie bekomme ich den Mock-Wert beim Aufruf von isKindOfClass für ein OCMock-Objekt?

+1

OCMockObject scheint die Basisklasse für dieses Framework zu sein. Rufen Sie + (id) mockForClass: Class auf und fragen Sie sich, warum sich das erstellte Objekt nicht selbst als die mokierte Klasse meldet? – JiuJitsuCoder

+0

Wenn Sie dieses Problem immer noch haben, können Sie Ihren Anwendungsfall vorstellen? Was versuchst du zu machen? Irgendein Code würde der Analyse helfen. –

+0

Es kann für jede Fabrikklasse nützlich sein, die Objekte abhängig von der Klasse eines Parameters erstellt. In meinem Fall muss ich reale Objekte erstellen, anstatt diese Fabriken zu testen. – Giuseppe

Antwort

0

Wenn Sie OCMock-Objekt an eine Methode übergeben möchten, bei der die Funktion isKindOfClass aufruft, müssen Sie einen partiellen Schein erstellen. Der folgende Code könnte Ihnen helfen. Es hat für mich funktioniert.

-(void)testMyTest 
{ 
    FirstViewController* masterVC = [[FirstViewController alloc]init]; 
    SecondViewController *second = [[SecondViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:second]; 
    [[master expect] getName:@"PARAM"]; 
    [masterVC doSomething:master]; 
    [master verify]; 

    [masterVC release]; 
    [second release]; 
} 

doSomething Methode innerhalb FirstViewController

-(void)doSomething:(SecondViewController *)detail 
{ 
    if ([detail isKindOfClass:[SecondViewController class]]) 
    { 
     NSString * returnVal = [detail getName:@"PARAM"]; 
     NSLog(@"returnVal %@",returnVal); 
    } 
} 

Eine weitere Alternative ist die isKindOfClass Methode spöttisch, also der Testfall wird

- (void)testMyTest 
{ 
    CalculatorViewController* masterVC = [[CalculatorViewController alloc]init]; 
    id master = [OCMockObject niceMockForClass:[SecondViewController class]]; 
    BOOL ret = YES; 
    [[[master expect] andReturnValue:OCMOCK_VALUE(ret)] isKindOfClass:[SecondViewController class]]; 
    [[master expect] getName:@"PARAM"]; 
    [masterVC doSomething:master]; 
    [master verify]; 
} 
+0

Der Vorteil von mock/niceMock besteht darin, dass Sie das Objekt nicht instanziieren müssen. In meinem Fall ist das Erstellen dieses Objekts schwierig. – Giuseppe

+0

ok. Eine Alternative ist das Mocking der isKindOfClass-Methode. etwas wie diese ID Master = [OCMockObject niceMockForClass: [SecondViewController-Klasse]]; BOOL ret = JA; // kann den Wert ändern [[[master expect] undReturnValue: OCMOCK_VALUE (ret)] isKindOfClass: [SecondViewController-Klasse]]; –

+0

Was ich tue ist, eine niceMock zu verwenden und die Methode "class" zu stubben, um die mokierte Klasse zurückzugeben. Dies ist zuverlässiger, um einfach JA für jede artOfClass zurückzugeben. Warum dies nicht das Standardverhalten von OCMock ist, ist für mich unklar. – Giuseppe

Verwandte Themen