如何从测试目标下的生产代码中获取Test Target Bundle Plist文件?

时间:2015-03-09 09:28:49

标签: ios swift testing properties plist

我需要从生产代码中标记某些特定于测试的情况,因为swift中不再存在预编译的宏(并且因为其他Swift标志似乎在目标基础上工作,但不是在特定于测试目标的基础上)我以为我可以使用测试plist来访问测试期间唯一可用的属性。

如果此策略有效,我需要从AppDelegates应用程序访问我的测试目标plist文件:didFinishLaunchingWithOption:-method。我在plist中有一个名为TEST_TARGET的Property,对于这个例子来说就是一个字符串。

enter image description here

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?这可以在不破坏测试和代码架构的任何基本原则的情况下完成。

编辑:只有拼写错误

1 个答案:

答案 0 :(得分:3)

在objC中我使用了这个:

获取测试包的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)
        }
    }

但是在SWIFT中工作


不同的解决方案

所以我建议在SCHEME中设置一个环境变量用于测试

enter image description here

然后在您的代码中检查它,如

let val = getenv("TESTING") //Val is a C String

更好:

let dict = NSProcessInfo.processInfo().environment 
let testing : AnyObject? = dict["TESTING"] //get a swift object