Avatar
init 内で Task を使うことが問題になるケースを説明します。ここで Example を Another が発行した要素ごとに、その要素が何番目だったかを外へ AsyncSequnce で伝えるコンポーネントだっとします。このテストは次のようになると思います: @Test private func testObservable() async { let another = StubAnother() let example = Example(observing: another) Task { another.sendEvent() // A another.sendEvent() // B another.sendEvent() // C another.finish() } var recorded = [Int]() for await i = example.countDidChange { recorded.append(i) } #expect(await recorded, [0, 1, 2, 3]) } この時、テストは成功するとは限りません。recorded は [0, 1, 2, 3], [1, 2, 3], [2, 3], [3], [] のいずれかになります。なぜなら、init 内の Task が始まり for await が引っかかったタイミングより前に A, B, C が実行される可能性があるからです。 (edited)
5:25 AM
この問題を解決・回避できないと AsyncSequence を使ったコードのテスタビリティがどうしても低くなってしまいます。みなさんどうされてるんでしょう