服务器端 Swift:测试使用 Bundle 的代码

Posted

技术标签:

【中文标题】服务器端 Swift:测试使用 Bundle 的代码【英文标题】:Server-side Swift: Testing Code That Uses Bundle 【发布时间】:2016-12-27 06:29:15 【问题描述】:

我正在使用服务器端 Swift,然后在 Xcode 中进行开发:

swift package generate-xcodeproj

我有一个类,它使用Bundle(以前的NSBundle)为服务器中的某些设置加载.plist 文件。它在服务器本身运行时工作正常,但是当我为这个类创建一些单元测试时,我无法访问 .plist 文件所在的目录。相关的sn-p代码为:

let bundlePath = Bundle.main.bundlePath as NSString
let plistPath = bundlePath.appendingPathComponent("Test.plist")
plistDict = NSDictionary(contentsOfFile: plistPath)

当我在 XCTests 单元中运行它时,plistPath 是:

/Applications/Xcode-8.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Agents/Test.plist

这不是很有用。

我注意到的一件事是“常规”选项卡下没有“主机应用程序:”选项。

想法?

【问题讨论】:

【参考方案1】:

我无法完全回答这个问题,但针对我的情况想出了一个解决方法。我正在使用 Perfect File 类(请参阅 https://github.com/PerfectlySoft/Perfect.git),并且只是在 setUp() 方法中为我的 XCTest 案例动态创建我需要的文件。幸运的是,我对文件内容的需求相当简单。这是我的 XCTest 文件的初始部分:

import XCTest
import SMServerLib
import PerfectLib

class TestPlistDictLoader: XCTestCase 
    var plistFileName:String! = "TestPlistDictLoader.plist"
    var pathName:String! = "/tmp"

    override func setUp() 
        super.setUp()
        // A bit of a hack, but I can't figure out a way otherwise to access the install directory where the code is running.
        // See also http://***.com/questions/41340114/server-side-swift-testing-code-that-uses-bundle
        // The only downside is that these tests don't test the `init(plistFileNameInBundle filename:String)` constructor that uses the Bundle.
        // Write the .plist file to a known location. Use only pure Swift methods.

        let plistPath = (pathName as NSString).appendingPathComponent(plistFileName)
        let plist = File(plistPath)
        try! plist.open(.write)
        try! plist.write(string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" +
            "<plist version=\"1.0\">\n" +
            "<dict>\n" +
                "<key>MyString</key>\n" +
                "<string>Hello World!</string>\n" +
                "<key>MyInteger</key>\n" +
                "<integer>100</integer>\n" +
            "</dict>\n" +
            "</plist>\n"
        )

        plist.close()
    

请参阅https://github.com/crspybits/SMServerLib 了解完整上下文。

【讨论】:

以上是关于服务器端 Swift:测试使用 Bundle 的代码的主要内容,如果未能解决你的问题,请参考以下文章

Vapor - 服务器端 Swift:找不到 css

nil在两个ViewController之间委派两个不同的Bundle(swift)

无法在非 XCode Swift 项目中执行“快速测试”

Angular 6 服务器端错误:找不到模块:错误:无法解析“./dist/server/main.bundle”

如何从 Objective-c/Swift 中的 settings.bundle 中检索值?

为啥不在swift 3中将database.db从bundle复制到文档目录? [复制]