我需要从生产代码中标记某些特定于测试的情况,因为swift中不再存在预编译的宏(并且因为其他Swift标志似乎在目标基础上工作,但不是在特定于测试目标的基础上)我以为我可以使用测试plist来访问测试期间唯一可用的属性。
如果此策略有效,我需要从AppDelegates应用程序访问我的测试目标plist文件:didFinishLaunchingWithOption:-method。我在plist中有一个名为TEST_TARGET的Property,对于这个例子来说就是一个字符串。
A related topic is discussed here。在我的AppDelegates应用程序中:didFinishLaunchingWithOption:-method我有以下几行代码:
var testSetting = NSBundle(forClass: self.dynamicType).objectForInfoDictionaryKey("TEST_TARGET") as? String
println("Testtarget: \(testSetting)")
运行时,这些代码行打印 Testtarget:nil 。但是,在TestClass设置方法中添加完全相同的代码行会产生 Testtarget的预期结果:可选(" \"这是测试目标\"" )
在我看来,NSBundle(forClass:self.dynamicType)在从AppDelegate调用时不会返回testBundle,这在某种程度上可以是逻辑的,因为AppDelegate类在mainBundle中。但是,有什么方法可以从生产代码中获取testPlist?这可以在不破坏测试和代码架构的任何基本原则的情况下完成。
编辑:只有拼写错误
答案 0 :(得分:3)
获取测试包的plist:
Class cls = NSClassFromString(@"YourOwnTestCaseClass");
if(cls) {
//the plist
id dict = [[NSBundle bundleForClass:cls] infoDictionary];
//the path to it (IF you need it)
id testPlistPath = [[NSBundle bundleForClass:cls] pathForResource:@"Info" ofType:@"plist"];
}
在swift中我认为我可以使用allBundles
let bundles = NSBundle.allBundles()
for bundle in bundles {
let val = bundle.objectForInfoDictionaryKey("TESTING")
if val != nil {
println(bundle.infoDictionary)
}
}
所以我建议在SCHEME中设置一个环境变量用于测试
然后在您的代码中检查它,如
let val = getenv("TESTING") //Val is a C String
更好:
let dict = NSProcessInfo.processInfo().environment
let testing : AnyObject? = dict["TESTING"] //get a swift object