Frage

Ich versuche, eine Methode zu verspotten, die das Äquivalent der folgenden Signatur:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error

Ich möchte es ein kleines Wörterbuch zurück, so dass mein Test der Code das Wörterbuch stellen Sie sicher, richtig verwendet. Doch egal, was ich tue OCMock immer nil aus dem Verfahren, unabhängig davon, wie i Stummel it out. Der Fehler beginnt als null in dem Code, den ich teste, und dies sind die verschiedenen Möglichkeiten, wie ich versucht habe stubbing es:

NSError * error = nil;
[[[mock stub] andReturn:someDict] uploadValues:YES error:&error];

[[[mock stub] andReturn:someDict] uploadValues:YES error:nil];

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg any]];

und keiner von ihnen arbeiten. Hat OCMock Stützgriffe als stubbed Nachricht Argumente und wenn ja, was ist der richtige Weg, es zu tun?

War es hilfreich?

Lösung

Leider habe ich keine gute Lösung für diese entweder gefunden. Das Beste, was ich sagen kann, ist zu versuchen, die Verwendung des NSError ** so klein wie möglich zu machen, und dann legt sie in einer isolierten Funktion, die Sie sich ganz auf Ihrem Teil-modell können.

Ich finde, dass jeder Code, der so ziemlich unmöglich ist, zu testen, mit OCMock etwas anderes als ein NSObject * (oder abgeleitet) oder primitive Werte (NSInteger, BOOL usw.) verwendet wird.

Andere Tipps

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]];

oder

NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];

Sie können auch tun

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];

aber dies könnte dazu führen, dass Code falsch denken, dass Sie übergeben eine echte NSError zurück.

Mit ARC, Ihre Methode Erklärung wird wahrscheinlich so aussehen:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error;

Hier ist, wie ich verspotten diese Arten von Methoden:

BOOL mockDoSomething = YES;

NSError __autoreleasing *error = nil;

[[[mock stub] andReturn:someDict] uploadValues:OCMOCK_VALUE(mockDoSomething) error:&error];
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];

[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})]
   yourMethodCall:err];

Ich habe eine Kategorie auf OCMArg mit dieser Situation zu unterstützen.

OCMArg + Helpers.h:

@interface OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError;

@end

OCMArg + Helpers.m:

@implementation OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError {
    return (NSError *__autoreleasing *)[OCMArg anyPointer];
}

@end

Dann, wenn ich einen Fehler param haben muss ich spotten, Gebrauch anyError, etwa so:

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top