The problem of finding Documents directory path in an unit test target on iOS

گاهی لازم می شود که مسیر دایرکتوری Documents در sandbox برنامه تان را بدست آورید. برای این کار معمولا از قطعه کد زیر استفاده می شود:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];

اگر روی Simulator برنامه اجرا شده باشد، مسیر چیزی شبیه این خواهد بود:

/Users/[User name]/Library/Application Support/iPhone Simulator/[iOS Version]/Applications/[App ID]/[App name].app/Documents

در صورتی که برنامه بر روی Device واقعی اجرا شود، مسیر شبیه این خواهد بود:

/var/mobile/Applications/<App ID>/Documents

در هر دو حالت App ID یک شناسه منحصر به فرد برای برنامه شماست.
وقتی می خواهید مسیر دایرکتوری Documents را در Unit Test با قطعه کد بالا به دست بیاورید با مشکل مواجه می شوید و مسیر بازگشتی صحیح نیست. علت صحیح نبودن مسیر نیز این است که مسیر بازگشتی شامل App ID نمی شود. در اغلب موارد دلیل این مشکل این است که کد تست ها نه در Context برنامه اصلی بلکه به صورت مستقل اجرا می شوند. برای حل این مشکل کافی است در تنظیمات Build مربوط به Target آن Unit Test مقدار Bundle Loader را برابر 

$(BUILT_PRODUCTS_DIR)/<app_name>.app/<app_name>

و مقدار Test Host را هم برابر

$(BUNDLE_LOADER)

قرار دهید.