【发布时间】:2018-10-23 19:47:36
【问题描述】:
我在一个 swift 项目中有一个单身人士(是的,我知道人们不喜欢这些,但如果你能暂时忽略这些,我将不胜感激)。
我正在编写一些不测试该单例的单元测试,但他们正在测试的功能取决于该单例的状态。单例是用静态 let 声明的,并且构造函数无论如何都是私有的,因此不能像这样重置它。
如果我正在运行一个单元测试,我可以通过在 setUp() 方法中设置一个从单例读取的变量来正确设置它,但是当我尝试对整个模块运行测试时,它使用第一个调用它的 setUp() 进行设置,然后它不会被重新实例化。所以基本上它卡在整个模块的状态中,这对我来说没有意义 - 我本来希望在测试之间重置所有内容。
有没有办法强制 XCTest 重置测试空间,以确保每次运行新测试文件而不是移动到新模块时重置此单例?
【问题讨论】:
-
我想你只是跑了,首先,为什么人们不建议使用单例,至少直接。请参阅stackoverflow.com/a/52879968/3141234,了解我对如何清理此问题的建议。
-
@Alexander-ReinstateMonica 虽然我同意为什么不应该使用单例的一些观点,但在这种情况下,我认为问题更深层次。如果他的单例在测试期间是“它卡在一个状态”,那么它在实际运行时会以同样的方式卡住。换句话说,那个单例具有不可逆的状态——这是一个有问题的设计。
-
嗯,我没关系。限制系统中状态转换的数量可以简化它。一种方式流程简化了事情,这很好。例如,
Shipment总是从Pending到Packing到Shipped到Delivered。在实际用例中,它永远不会从Shipped变为Pending。如果是这样的话,我认为最好只生成一个新的货物,并让事情朝着“快乐”的方向流动,而不是试图使所有可能的状态转换成为可能(并处理所有需要的测试后果)