iphone - وحدة اختبار لا يمكن العثور على ملف نموذج البيانات الأساسية




cocoa xcode unit-testing ocunit (5)

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

الحل الأكثر بسيطة وأكثر مرونة سيتم استخدام أسلوب bundleForClass: NSBundle ضمن رمز الاختبار الخاص بك. المعلمة لهذه الطريقة يمكن ببساطة أن تعطى من قبل [self class] ضمن الاختبارات الخاصة بك. وبهذه الطريقة يمكنك إعادة استخدام هذه التعليمات البرمجية دون الحاجة إلى ضبط معرفات الحزمة في مشاريع متعددة.

مثال:

- (void)testBundleLocation
{
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSURL *url = [bundle URLForResource:@"myDataModel" withExtension:@"momd"];
    ...
}

لقد قمت بإنشاء مشروع مع نموذج البيانات الأساسية في ذلك. التطبيق يبحث عن ملف النموذج (.momd) ويدير على ما يرام.

لسوء الحظ، يبقى اختبار الوحدة عديم القيمة:

NSURL *dataModelURL = [[NSBundle mainBundle] URLForResource:@"myDataModel" withExtension:@"momd"];

أستطيع أن أرى المجلد myDataModel.xdatamodeld والملف في كل من الهدف الرئيسي ودليل تجميع مصادر الهدف اختبار وحدة - ولكن هذا لا يبدو كافيا. ماذا أنا في عداد المفقودين في الهدف اختبار وحدة؟

شكرا، -Luther


الجواب له علاقة مع حزمة. لا يستخدم هدف اختبار الوحدة الحزمة "الرئيسية". أنه يخلق حزمة الخاصة التي، في حالتي، تعثرت إلى 'com.yourcompany.UnitTest' - مباشرة من [الهدف] -info.plist.

ثم يبدو الحل المصحح كما يلي:

NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.yourcompany.UnitTests"];
NSURL *url = [bundle URLForResource:@"myDataModel" withExtension:@"momd"];

شكر


مشكلتي كانت في الحقيقة الحزمة الخاطئة! كما كنت أحاول استخدام قاعدة بيانات من / ضمن إطار I 'ببساطة' لديه لتحميل ديسيبل من Bundle المقابلة!

هنا هو بعض التعليمات البرمجية في Swift4 باستخدام MagicalRecord :

// Load the bundle
let frameworkBundle = Bundle(for: AClassFromTheFramework.self)
let managedObjectModel = NSManagedObjectModel.mergedModel(from: [frameworkBundle])
// Use the new `managedObjectModel` by default
MagicalRecord.setShouldAutoCreateManagedObjectModel(false)
NSManagedObjectModel.mr_setDefaultManagedObjectModel(managedObjectModel)
// Load the database 
MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: "db.sqlite")

و فويلا!


كان مشكلة مماثلة، أنا حلها باستخدام إطار أوكوك، لذلك لم أكن بحاجة إلى تغيير رمز التطبيق

@interface TestCase()
    @property (nonatomic, strong) id bundleMock;
@end

@implementation TestCase

- (void)setUp
{
    self.bundleMock = [OCMockObject mockForClass:[NSBundle class]];
    [[[self.bundleMock stub] andReturn:[NSBundle bundleForClass:[self class]]] mainBundle];
    [super setUp];
}

- (void)tearDown
{
    [self.bundleMock stopMocking];
    [super tearDown];
}

لقد ألعبت مع وحدة اختبار عدد من المرات ، وما زلت على اقتناع بأن الأمر يستحق الجهد المبذول في وضعي.

أطور مواقع ويب ، حيث ينطوي الكثير من المنطق على إنشاء البيانات أو استرجاعها أو تحديثها في قاعدة البيانات. عندما حاولت أن "أسخر" من قاعدة البيانات لأغراض اختبار الوحدة ، فقد أصبح الأمر شديد الفوضى ويبدو عديم الجدوى بعض الشيء.

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

أستطيع أن أرى أنه قد يكون من المفيد عندما يعمل فريق من المطورين على مشروع وتحديث رمز بعضهم البعض ، ولكن حتى في ذلك الحين أعتقد أنه إذا كان المطورين يتمتعون بجودة عالية ، فيجب أن يكون التواصل الجيد والشفرة المكتوبة بشكل جيد كافية .







iphone cocoa xcode unit-testing ocunit