سؤال

أحاول أن أسخر طريقة تحتوي على ما يعادل التوقيع التالي:

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

أريد ذلك لإرجاع قاموس صغير بحيث يمكن للاختبار الخاص بي التأكد من استخدام الرمز القاموس بشكل صحيح. ومع ذلك، بغض النظر عن ما أقوم به Ommock دائما يعود لا شيء من الطريقة، بغض النظر عن كيفية كعبه. يبدأ الخطأ في كيل في التعليمات البرمجية، واختبر هذه الطرق المختلفة التي جربتها stubbing لها:

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]];

ولم يعمل أي منهم. هل يدعم OCMOCK مقابض مثل حجج الرسائل Stubbed وإذا كان الأمر كذلك، فما هي الطريقة الصحيحة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

للأسف، لم أجد حل جيد لهذا أيضا. أفضل ما يمكنني قوله هو محاولة استخدام NSError ** صغير قدر الإمكان، ثم ضعه في وظيفة معزولة يمكنك أن تسخر تماما على طريقك الجزئي.

أجد أن أي رمز يستخدم أي شيء آخر غير NSOBJECT * (أو مشتقة) أو قيم بدائية (NSINTEGER، BOOL، إلخ) من المستحيل للغاية اختبار استخدام OCMOCK.

نصائح أخرى

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

أو

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

يمكنك أيضا القيام به

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

ولكن قد يتسبب هذا في أن يعتقد الكود الخاص بك بشكل غير صحيح أنك مررت Nserror حقيقي.

مع ARC، من المحتمل أن يشبه إعلان الطريقة هذه:

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

إليكم كيف أسخر من هذه الأنواع من الطرق:

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];

قمت بإنشاء فئة على OCMARG للمساعدة مع هذا الموقف.

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

ثم، كلما كان لدي خطأ في الخطأ، أحتاج إلى وهمية، واستخدام anyError, ، مثل ذلك:

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top