Swift Combine PassThroughSubject 没有在 XCTestCase

问题描述

我正在为我在 iOS 应用中处理的一些代码编写单元测试,但遇到了非常奇怪的行为。
我的代码中的 PassthroughSubject 接收器闭包没有运行,因此测试失败。当我取消注释下面代码中的打印行时,它会通过。它在操场上也毫无问题地通过。我尝试了整个 Xcode 删除派生数据技巧,但没有奏效。我试图将类和单元测试移动到一个完全不同的项目,但它仍然失败。对我来说,这看起来像是 Apple 的错误,但想在这里问一下是否有人有任何见解。看下面的代码。请注意,我对原始项目中的代码进行了一些简化,以使其更易于阅读。这让我觉得 RxSwift 在这一点上比 Combine 更加精致。在 RxSwift 中从未见过这样的事情发生。

class BadPassthroughSendClass {

    let publisher = PassthroughSubject<Any,Never>()
    var anyCancellable: AnyCancellable?
    var sinkClosureBlock: (()->())?

    init() {
        createSubscription()
    }

    func createSubscription() {
        let subscription = publisher
            .subscribe(on: dispatchQueue.global())
            .receive(on: dispatchQueue.global())
            .sink { [uNowned self] event in
                sinkClosureBlock?()
            }
        anyCancellable = AnyCancellable(subscription)
    }

}

class UnitTests: XCTestCase {

    func testBadPassthroughClass() {
        let badClass = BadPassthroughSendClass()
        let sinkExpectation = expectation(description: "Sink closure should fire")
        badClass.sinkClosureBlock = {
            sinkExpectation.fulfill()
        }
        // print("pass the test with this line")
        badClass.publisher.send("my test message")
        waitForExpectations(timeout: 0.5)
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)