单元测试 VIPER 协议

Posted

技术标签:

【中文标题】单元测试 VIPER 协议【英文标题】:unit testing VIPER protocols 【发布时间】:2020-06-15 23:36:25 【问题描述】:

在阅读了几篇关于这个问题的帖子和文章后,我仍然对如何在 VIPER 架构中测试方法(例如使用 Swift)感到困惑。

如果我有这个代码:

主讲课

protocol InteractorToPresenterProtocol: class 

    func showInfo(info: Info)


class Presenter 

    private var interactor: PresenterToInteractorProtocol?

    init() 

    func makeSomeStuffInPresenter() 

        // make some stuff 
        ...
        interactor?.makeSomeStuffInInteractor()
    


extension Presenter : InteractorToPresenterProtocol 

    func showInfo(info: Info) 

       print(info)
        

交互类:

protocol PresenterToInteractorProtocol: class 

    func makeSomeStuffInInteractor()


class Interactor 

    private var presenter: InteractorToPresenterProtocol?

    init() 


extension Interactor : PresenterToInteractorProtocol 

    func makeSomeStuffInInteractor() 

       // make some stuff 
       ...
       presenter?.showInfo(info)
        

我应该如何测试 makeSomeStuffInPresenter 方法?

【问题讨论】:

制作Presenter并调用方法?不清楚困难在哪里。 这对我来说很难的原因是makeSomeStuffInInteractor的结果没有在那个方法中返回,而是调用了另一个方法。makeSomeStuffInInteractor的结果确实是在我的presenter showInfo方法中获得的。跨度> 你也可以做一个交互器,或者你可以使用依赖注入来武装自己,用一个交互器的模拟。 是的,我可以注入交互器并模拟它。 【参考方案1】:

您可以查看附件sample.

viper架构的基本了解如下。

视图:管理向用户显示的视图。 交互者:处理业务逻辑。 Presenter:控制 View 和 Interactor 之间的通信。 实体:是模态类。 路由器:负责管理导航。

编写单元测试用例。

对于 Interactor :您可以选择 Interactor 协议来模拟类,并使用正面和负面案例调用它的函数,您的 Presenter 将满足测试用例的期望。

对于 Presenter :同样,您可以模拟 Interactor、View 和调用 Presenter 函数,视图将满足测试用例的期望。

一般来说,对于 V,I,P,E,R 中的每个区域 z,您可以模拟到其他 4 个具有模拟简单化和可重复性的区域,以便被测区域 (ZUT) 是唯一正在执行真实源代码的区域(孤立地)。

【讨论】:

附上的样本很清楚!

以上是关于单元测试 VIPER 协议的主要内容,如果未能解决你的问题,请参考以下文章

单元测试视图在 XCTestCase 中被驳回

手撸golang 学etcd 手写raft协议之12 单元测试

Go: WebSockets单元测试

在 Swift 中对私有变量进行单元测试

如何对 CloudKit/Core Data 进行单元测试?

自动化单元测试工具目前常用的都有哪些?