1

我正在使用Quick来测试我的 Swift 代码。但是,我认为它不会释放describe范围内定义的对象:

class MyClass {
    deinit {
        print(self, #function)
    }
}

final class MyClassSpec: QuickSpec {
    override func spec() {
        describe("") {
            let foo = MyClass()
            it("") {
                print(foo)
                expect(true).to(beTrue())
            }
        }
    }
}

我没有看到内部的任何输出,并且print内部deinit的调试断点deinit没有被捕获。如果我移动foo到里面itdeinit就会调用。

这是 Quick 中的错误,还是deinit在测试套件中不被调用是否正常?

4

1 回答 1

1

显然,我编写的代码不仅保留了对象,而且还是一种反模式。

即使是普通的 old 也会XCTestCase保留一个对象:

class MyClass {
    deinit {
        print(self, #function)
    }
}

final class MyClassTest: XCTestCase {
    let foo = MyClass()

    func testMyClass() {
        print(foo)
        XCTAssert(true)
    }
}

deinit不要求foo

这是由于XCTestCase—<a href="https://qualitycoding.org/xctestcase-teardown/" rel="nofollow noreferrer">它永远不会真正被deinit编辑的性质。因此,应该始终使用setUp&tearDown来管理所有内容(或更准确地说,是具有引用语义的对象)。

我相信这也直接转化QuickSpec为,所以我应该总是使用beforeEach&afterEach来管理对象。要“解决”问题,我应该进行如下测试:

final class MyClassSpec: QuickSpec {
    override func spec() {
        describe("") {
            let foo: MyClass!

            beforeEach { foo = MyClass() }
            afterEach { foo = nil }

            it("") {
                print(foo)
                expect(true).to(beTrue())
            }
        }
    }
}
于 2020-05-16T11:35:43.960 回答