Tag: Clean Swift

IOS中的VIP(干净的Swift架构)

VIP还鼓励使用模板“促进”其实施。您可以在Clean Swift IOS体系结构上找到模板,以及有关VIP生命周期的更多详细信息。 使用这些模板,您无需担心项目中VIP架构的实现。 模板有助于轻松编写测试用例。 VIP单向方式 VIPER双向方法 在上图中,我们可以看到VIP架构采用的是单向方法,与VIPER有所不同,后者遵循的是双向方法。这两种架构均基于Single Responsibility Principle(单一责任原则),可带来整洁的架构和更好的可测试性。 如何在项目中使用VIP模板 首先从干净的Swift架构下载模板 将干净的swift文件夹复制到/ Users / / Library / Developer / Xcode / Templates / File \ Templates 启动Xcode并创建一个新文件(文件>新建>文件或⌘N) 搜索Clean Swift部分,然后在可用模板之间进行选择 这样,您就可以轻松地在项目中实施VIP架构。 同样,VIP模板具有用于单元测试实施的模板。 众所周知,VIP完全支持TDD(测试驱动开发)。您不必担心为项目编写单元测试类。 VIP演示项目 如果您对它在现实生活项目中的实施更加困惑,我在Github项目中对VIP架构做了简单的演示。 关于项目中的实施以及单元测试的实施,以便您可以开始遵循项目中的TDD(测试驱动开发)。 VIP架构实施 VIP不仅由三部分组成,尽管其名称仅是VIP,但它不仅具有ViewControllers,Interactors和Presenters等更多的组件,例如数据模型,路由器和Workers,而且可以将Viewcontrollers划分为Configurator。变得庞大。 ViewController 在ViewController的viewDidLoad() ,我们需要运行一些业务逻辑,因此我们将其称为fetchPosts() 。 在fetchPosts() ,我们在输出(交互器)上调用fetchPosts(request) )。 而已。 我们要求输出执行我们的业务逻辑。 视图控制器不需要也不应该关心谁以及如何完成。但是,如果有必要,可以将ViewController划分为Configurator。 互动者 交互器包含您应用程序的业务逻辑。 用户在您的UI中点击并滑动即可与您的应用进行交互。 视图控制器从UI收集用户输入,并将其传递给交互器。 然后,它检索一些模型,并要求一些工人进行这项工作。 工人 帖子视图可能需要从Core […]

如何在Clean-Swift中编写单元测试

在 第1部分中, 我解释了如何改善应用程序的体系结构,使其更好地进行单元测试。 编写测试应该和编写代码一样有趣,对吗? 但是为什么不呢? 这就是我问自己的问题,我注意到每次尝试编写一些测试时,我都不知道从哪里开始或要测试什么。 而且,如果我有一个主意,结果证明我无法测试或不知道如何测试。 一段时间后,我开始意识到,如果您的代码结构清晰,那么您将知道在代码中放置什么内容,并且可以清楚地测试什么。 在第1部分中,您可以阅读如何根据Clean Swift模式构造代码。 在这一部分中,您可以阅读可以测试的内容以及如何进行测试。 通常,好的测试是灵活的,但并不脆弱,这意味着,如果更改一行代码,则不应破坏很多测试。 您的测试应该广泛,涵盖所有边缘情况并快速运行。 因此,您可以经常运行它们并尽快获得反馈。 单元测试的结构 在测试中,您可以区分要测试的主题 , 输入和输出 。 最好确定这三个不同的部分,因为它们可以帮助您弄清楚您需要如何处理它们。 例如,您永远不会存根您的测试主题,但可以存根 。 您将需要尽可能多的输入集测试以测试其结果。 并且在测试的断言中验证输出的值。 单元测试的典型结构是: 给定 什么时候 然后 在“ 给定中,您将创建模拟并准备输入”中,在“执行方法以对主题进行测试时”中, 然后在“使用声明中验证输出”。 不同类型的测试双打 为了为我们的测试创建真正的黑匣子,我们可能希望掩盖实现的某些部分。 我们可以使用所谓的测试双打来做到这一点。 当您必须在测试中传递参数时,但是您知道它永远不会在被测试的方法中使用时,可以传递一个哑元 。 假人返回什么都无所谓。 当您需要一个返回特定值的虚拟对象,因为系统的其余部分依靠它继续运行测试时,该虚拟对象称为stub 。 如果仅想测试是否调用了方法,则可以使用间谍 。 不利的一面是,您监视的内容越多,您将测试与应用程序实现的耦合就越紧密。 模拟是其中包含断言的间谍。 它检查使用什么参数,何时以及多久调用一次函数。 我们最后的味道是假的 。 到目前为止,所有讨论过的测试倍数都不关心您传入的参数。但是假冒的确如此,因为它具有业务逻辑,可以为不同的输入提供不同的输出。 将单元测试文件添加到您的项目 要将单元测试文件添加到Xcode项目中,可以在新项目开始时检查单元测试,也可以稍后将测试目标添加到现有项目中。 在项目浏览器中单击您的项目 ,添加一个新目标并选择一个单元测试包 : 在文件顶部,您需要import XCTest并通过添加@testable import […]

设置Clean Swift模式有助于编写单元测试

您是否知道这些时刻可以启动应用程序,说服自己需要通过编写尽可能多的单元测试来证明质量? 在那之前,您发现几乎不可能或花费大量时间编写适当的单元测试。 好了,我有了这些时刻,并开始意识到,您的应用程序中的良好模式有助于编写单元测试。 好的模式是第一位的 为了编写更好的单元测试,您需要一个一致的模式。 如果您想编写更好的单元测试,那么MVC模式绝对不是最佳模式。 大多数情况下,您会得到一个非常大的ViewController ,其中包含各种工作:Massive View Controller。 在良好的模式下,每个组件都充当独立于任何其他组件的黑匣子。 黑匣子里面发生了什么,您不知道也不在乎。 但是这些黑匣子应具有定义明确的输入和输出。 在一致的结构中,应该更容易识别组件,测试主题,输入和输出。 代码独立性是通过在Swift中使用协议来实现的。 通过使用协议,一个组件不会直接拥有另一个组件,而是通过协议间接引用了该组件。 这样,这两个组件不会互相了解,但是都依赖于相同的协议。 在将数据从一个组件发送到另一个组件时,模型结构可以在Swift中提供数据独立性。 通过为数据请求,数据响应和视图模型创建单独的模型,可以避免在更改一个模型时还必须更改将模型用作输入或输出的对象以外的组件。 这也适用于他们的测试,这使这些测试不那么脆弱。 我遇到的一个不错的模式是使用VIP循环的Clean-Swift 。 在这种模式下,一切都会通过一个VIP循环朝一个方向前进。 它从ViewController开始,到Interactor ,再到Presenter ,最后回到ViewController 。 两个组件通过包含输出和输入逻辑的协议相互通信。 ViewController处理显示逻辑, Interactor业务逻辑和Presenter表示逻辑。 对于单元测试,这意味着您可以在每个边界上测试所有协议方法,因此它将完全覆盖所有组件。 哪里去了? 开始时,可​​能不清楚在代码中的什么位置。 为了更好地理解我们所追求的模式的实现,我将举一个例子。 在此示例中,我在UITableViewController中显示电影标题及其发行年份的列表。 电影的模型如下所示: 结构电影{ 让标题:字符串 让releaseDate:字符串 } 首先,我创建一个具有Interactable- , Presentable-和Displayable协议的ListMoviesViewController , ListMoviesInteractor和ListMoviesPresenter 。 如果您开始编写应用程序代码,则最简单的方法是先从ViewController , Interactor和Presenter开始 。 开始编写单元测试时,最简单的方法是从Interactor , Presenter和ViewController开始 。 在VIP模式中, […]

[迅捷]干净迅捷(1)

MVC的所有其他应用程序。 –지개이크린을지VC지패턴으30–40 MVC패턴으로관리하기에가있습니다。 Model이유로模型。 视图。 控制器(MVC)由Massive View Controller提供给您…… controller다보면View controller가뚱뚱해지는것은정부다없습니。 清理Clean Swift포다하겠습니다。 清洁雨燕? 清理swift VIP로쉽게로VIP패턴을사용하게다。 https://clean-swift.com/접속해보면는이지에서문제문。다고같습니다같습니다。 ViewController的이수수정수리새로새운것을가하기하제 1 Model클래로로로Model Model만또한는는는는만만 토이하나의스토리보드를사용하는문제 재현하는데가생겨4시간을,그리고주일을가지지제 시를를하하하하하하를,,, TDD기법이제대로활용이안되는 现场场景5配景景物图景物图。 (ViewController,模型,交互器,演示者,路由器) 이제코드를보살펴다。 https://medium.com/swift2go/installing-the-clean-swift-template-in-xcode-6b4367006827방법이설명되어있습니다。 文件->新文件->文件清理Clean Swift场景场景이개의5개의이자동으로생성됩니다。 模型模型 型号–저장모든모델을저장。 Requset -API请求에보내지는데 响应-API로부터响应를拦截데이터를 ViewModel -UI관련된모든것을모든것을 工人迅捷 工作者-API / CoreData。 交互器데이터를다 Interactor.swift Interactor -Worker와Presneter照片。 VC-模型(请求)-交互者-工人-模型(响应)-交互者-演示者흐름이다。 演示者 Presenter -Interactor在ViewModel上进行下载。 용자에게사용자에게이터를보여질지결정한다 路由器.swift 路由器-사사이에서이데过渡과传递을리을다 이렇게설명해드렸습니다。 기본로설명을하여이잘이있습니이잘다실수도다。 https://github.com/Clean-Swift/CleanStore补充说明下载https://hackernoon.com/introducing-clean-swift-architecture-vip-770a639ad7bf。 […]