【问题标题】:How do I unit test Protocol and it's extension我如何对协议及其扩展进行单元测试
【发布时间】:2021-03-01 09:41:22
【问题描述】:

我有一个协议,我在扩展中有它的定义。

我想对定义进行单元测试。

我用谷歌搜索,但找不到任何相关内容。

我得到的最接近的是 Mocking with Protocol 或 POP 等。

如果有人可以用示例解释我,那就太好了。

【问题讨论】:

  • 您应该定义更多关于您要测试什么的信息? API 测试、逻辑测试等……协议可以做很多事情 :)
  • 一些返回资产图像,一些显示吐司等。

标签: swift unit-testing protocols swift-protocols protocol-extension


【解决方案1】:

不需要对协议本身进行单元测试,你应该测试符合的类型。如果你有一个协议扩展,你想测试一些默认行为,那么在你的测试目标中创建一些符合协议的基本结构或类,并在你的测试中使用它。

这是一个示例,给定以下协议,其中包含一个函数和该函数的默认实现

protocol Example {
    func calculate(_ x: Int) -> Int
}

extension Example {
    func calculate(_ x: Int) -> Int {
        x * 2
    }
} 

你可以在你的测试目标中添加一个简单的结构来测试它,因为我们想要测试默认的实现结构变得非常简单

struct TestExample: Example {}

然后对此的单元测试可能看起来像

func testDefaultCalculation() {
    let sut = TestExample()
    XCTAssertEqual(2, sut.calculate(1))
}

【讨论】:

  • 项目中有很多协议,降低了单元测试覆盖率。有什么方法可以从单元测试代码覆盖率中排除协议和其他一些方法?
  • @Amogam 没有协议不会降低覆盖率值。在上面的示例中,我将获得 100% 的代码覆盖率,因为我对 calculate() 的默认实现进行了测试,计算代码覆盖率时不包括实际定义 protocol Example {...}
  • 感谢您的回复。结构和枚举文件怎么样?那些包含在代码覆盖范围内吗?
  • structs 是的,枚举不是实际的 case ... 定义,而是您添加的任何其他代码。
猜你喜欢
  • 2019-02-04
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多