Swift项目的单元测试类

5

我创建了一个新的单视图Swift项目,创建了一个 MyModel

class MyModel {

    func add(a : Int, b : Int) -> Int {
        return a + b
    }
}

我有一个问题要创建一个测试用例,但是出现了错误信息:

/Volumes/Macintosh HD/Users/user/Projects/TestCase/TestCaseTests/TestCaseTests.swift:26:19: Use of unresolved identifier 'model'

enter image description here

如您所见,import TextCase(我的目标)没有解决问题。解决问题的唯一方法就是将MyModel.swift添加到目标:TestCaseTests。但这与Objective-C项目不同(我根本不需要将.m文件添加到测试用例目标中)。这是一个错误还是设计原因?


你是否将文件添加到测试用例中了?请参考... https://medium.com/swift-programming/swift-testing-privates-or-rather-internals-9a3ac5a8a501 - kasplat
3个回答

17

您应该将要测试的Swift文件添加到测试目标中。

可以通过单击Swift文件,进入“实用程序”面板(右侧面板),并勾选“目标成员资格”下面的复选框来完成此操作。

add testing target to swift file

无需将访问修饰符更改为public,使用internal即可。


更新

自XCode 7以来,不再需要使任何文件成为测试目标的成员。

建议的方法是使用@testable import {Product Module Name}。只需确保使用产品模块的名称而不是项目的文件夹名称即可。


3
这种方法的缺点是,你在该类中使用的所有依赖项也需要添加到测试目标中。当然了,有没有更好的方法呢? - BlueVoodoo
1
这基本上违背了单元测试设置的目标依赖的初衷。 - LightningStryk
产品模块名称可以在主目标的包装部分找到。 - railwayparade

5

根据这个答案,现在可以使用@testable import {模块名称}(使用Xcode 7)。


你应该引用完整的答案,特别是当你没有直接链接到答案而是链接到问题时(让我们去阅读/猜测你所指的内容)。 - Machavity
这是新的正确答案。然而,现在应该有关于如何测试可测试性的更多信息。 - Scott H

4

从Beta 4开始,访问修饰符已经可用,并且单元测试类现在被认为是主题模块之外的,因此如果要访问模块内的任何内容,则必须将其声明为public

public class MyModel {

    public func add(a : Int, b : Int) -> Int {
        return a + b
    }

}

1
即使我添加了public,它仍然无法正常工作。到目前为止,唯一的解决方法是将其添加到我的测试目标中。 - Bagusflyer
@bagusflyer,你是否将包含MyModel()的ProjectName导入到单元测试类中了? - TheLazyChap
我尝试导入ProjectName。(截图中没有显示此情况)。这并没有帮助。唯一的方法是将MyModel添加到我的TestCase目标中。 - Bagusflyer
1
谢谢!我的头撞墙撞疼了。 - Tim Scott
1
那么有没有更好的解决方案,而不需要将MyModel.swift添加到测试目标中?这种方法对于模型来说行不通,因为当模型类被添加到测试目标时,模型会选择错误的目标作为命名空间。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接