gpt4 book ai didi

ios - 单元测试 UICollectionView.indexPath(: UICollectionViewCell)

转载 作者:行者123 更新时间:2023-11-29 05:10:40 25 4
gpt4 key购买 nike

我正在尝试在 ViewController 中对这段代码进行单元测试

    func categoryTextEditedAt(_ cell: UICollectionViewCell, _ text: String) {
guard let indexPath = self.collectionView.indexPath(for: cell), text != "" else {return}

//Rest of the codes to be tested
}

并且在我的单元测试中测试上述函数如下:

    func testCategoryTextEditedAt() {
sut.viewDidLoad()
sut.collectionView.reloadData()
let cell = sut.collectionView.dataSource?.collectionView(sut.collectionView, cellForItemAt: IndexPath(item: 0, section: 0))
sut.categoryTextEditedAt(cell!, "testString")
}

但我在 categoryTextEditedAt(:) 函数内的 indexPath 一直得到“nil”。在调试时,我发现 testCategoryTextEditedAt() 单元格内有一个值,但 self.collectionView.indexPath(for:cell) 不断为“indexPath”返回“nil”。

我该如何进行这个过程?

最佳答案

我的猜测是你的问题是因为你试图在错误的地方测试代码。

想象一下,如果你必须测试一个单元函数,你需要实例化所有 UICollection 结构,这是一种不好的味道。

例如,您可以这样做。

enum UseCaseError {
textEmpty
}

class UseCase {
private let index: Int
private let text: String
init(index: Int, text: String) {
self.index = index
self.text = text
}

public func execute() throws {
guard text.isEmpty == false else {
throw UseCaseError.textEmpty
}

// your logic here to be tested
}
}

看看这个UseCase,您可以测试text何时为空以及您的所有业务逻辑

现在您只需将其放入categoryTextEditedAt方法

func categoryTextEditedAt(_ cell: UICollectionViewCell, _ text: String) {
guard let indexPath = self.collectionView.indexPath(for: cell) { return }
try? UseCase(index: indexPath.item, text: text).execute()
}

如果您将代码分开,您可以之前对其进行测试,并且您不需要浪费时间尝试使 UIKit 函数正常工作,只需您的逻辑即可。

我希望通过这个例子对您有所帮助。

关于ios - 单元测试 UICollectionView.indexPath(: UICollectionViewCell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com