当 运行 XCTest 时,`[[NSBundle mainBundle] bundleIdentifier]` 为 nil

`[[NSBundle mainBundle] bundleIdentifier]` is nil when running XCTest

即使在“...测试”目标中定义它 Info.plist,标识符仍然为零。我需要它对第三方库具有有效值。

这是因为单元测试不会加载您的应用程序包,甚至不会将单元测试包作为主包加载。

有关这方面的更多信息,请参阅

现在我们可以通过在您的单元测试项目中包含 NSBundle 上的类别来解决这个问题。 Objective-C 类别 hack 也适用于 swift 单元测试,因为 Bundle 桥接到 NSBundle,只需确保你的单元测试项目有一个桥接 header。

然后您可以让它搜索正确的主包,但如果您只是想要一种快速而肮脏的方式来获得有效的包标识符,请使用以下内容

@interface NSBundle (BundleIdentifier)

-(NSString *)bundleIdentifier;

@end

@implementation NSBundle (BundleIdentifier)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
-(NSString *)bundleIdentifier
{
    return @"com.yourcompany.yourapp.unitTests";
}
#pragma clang diagnostic pop

@end

现在剩下的就是在单元测试中包含 header 文件,以便加载类别。