【问题标题】:What's best way to mock objects in swift within XCTest?在 XCTest 中快速模拟对象的最佳方法是什么?
【发布时间】:2014-08-22 17:55:32
【问题描述】:

在 XCTest 中快速模拟对象的最佳方法是什么? 它只是在具有所需功能的函数中定义类吗? 还是有更好的选择?

【问题讨论】:

  • 你能提供更多关于用例的信息吗?当人们说“模拟对象”时,他们可能意味着很多不同的东西——你的意思是:(a) 你可以设定期望并验证期望得到满足的对象? (b) 可以存根方法实现并设置返回值的依赖对象? (c) 一般只测试双打?也许更多的上下文或示例会有所帮助
  • 所有这些选项(a、b、c)
  • 我希望看到类似 Mockito 和 OCMock 的支持。将对象存根并使用它所接触的对象的预期行为来测试原始对象的能力是关键。

标签: mocking swift xctest


【解决方案1】:

您可以使用MockFive 进行协议模拟和类模拟。它记录被调用的方法和传入的参数,并允许您在运行时存根方法,因此您只需编写一个模拟并在每个测试的基础上对其进行配置。我写了一篇关于如何使用它的文章here

【讨论】:

  • 丹尼尔,欢迎来到堆栈。你有几个关于这个问题的答案。尝试删除一个。有删除链接。关于您真正拼写出来的另一个问题的好答案。尽量不要“仅链接”答案,因为它们只会被删除或不受欢迎的 cmets 出现在它们下面。
  • 你应该公开你是这个框架的作者。
【解决方案2】:

我推荐使用Cuckoo,类似于Mockito。

示例类:

class ExampleObject {

    var number: Int = 0

    func evaluate(number: Int) -> Bool {
        return self.number == number
    }

}

class ExampleChecker {

    func check(object: ExampleObject) -> Bool {
        return object.evaluate(5)
    }

}

示例测试:

@testable import App
import Cuckoo
import XCTest

class ExampleCheckerTests: XCTestCase {

    func testCheck() {
        // 1. Arrange
        let object = MockExampleObject().spy(on: ExampleObject())
        stub(object) { object in
            when(object.evaluate(any())).thenDoNothing()
        }
        let checker = ExampleChecker()

        // 2. Action
        checker.check(object)

        // 3. Assert
        _ = verify(object).number.get
        verify(object).evaluate(any())
        verifyNoMoreInteractions(object)
    }

}

注意MockExampleObject 类是使用自定义Run script(在Build Phases)自动生成的,Cuckoo 文档提到(在他们的安装部分)。

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2015-10-15
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多