【问题标题】:XCTest expect method call with swiftXCTest 期望快速调用方法
【发布时间】:2014-11-21 01:15:30
【问题描述】:

如何使用 swift 和 XCTest 编写期望方法调用的测试?

我可以使用 OCMock,但他们不正式支持 swift,所以没有太多选择。

【问题讨论】:

  • Mocking in Swift 的可能重复项
  • 我的问题与那个问题的不同之处在于我希望期待一个方法调用,而不仅仅是模拟一个方法。

标签: ios swift ios8 ocmock xctest


【解决方案1】:

正如你所说,OCMock 不支持 Swift(也不支持 OCMockito),所以目前我看到的唯一方法是创建一个手卷模拟。在 swift 中,这会稍微不那么痛苦,因为您可以在方法中创建内部类,但仍然不如模拟框架那么方便。

这里有一个例子。代码是不言自明的,我唯一要做的(见下面的编辑1)就是将我想从测试中使用的类和方法声明为公共的(似乎测试类不属于相同应用程序的代码模块 - 将尝试找到解决方案)。

编辑 1 2016/4/27: 由于您可以使用“@testable import ModuleName”功能,因此不再需要将您想要测试的类声明为公共类。

测试:

import XCTest
import SwiftMockingPoC

class MyClassTests: XCTestCase {

    func test__myMethod() {
        // prepare
        class MyServiceMock : MyService {

            var doSomethingWasCalled = false

            override func doSomething(){
                doSomethingWasCalled = true
            }

        }
        let myServiceMock = MyServiceMock()

        let sut = MyClass(myService: myServiceMock)

        // test
        sut.myMethod()

        // verify
        XCTAssertTrue(myServiceMock.doSomethingWasCalled)
    }

}

MyClass.swift

public class MyClass {

    let myService: MyService

    public init(myService: MyService) {
        self.myService = myService
    }

    public func myMethod() {
        myService.doSomething()
    }

}

MyService.swift

public class MyService {

    public init() {

    }

    public func doSomething() {

    }

}

【讨论】:

  • 我不想只为模拟类中的“doSomethingWasCalled”创建一个变量,然后为我希望调用的每个方法创建一个断言。我想要的东西更像是在模拟类之外用expectationWithDescription声明一个变量,在模拟类方法中满足它的期望,然后在测试中调用waitForExpectationsWithTimeout。但这不起作用,测试无法编译(或给我“SourceKitService Crashed”错误,不记得了,现在无法测试,因为我的代码由于其他原因而无法编译实施)。
  • 我也不能像你那样覆盖测试中的方法。同样的错误,“SourceKitService 崩溃”。
  • AFAIK XCTestExpectation 用于异步测试,除非您愿意,否则我认为没有理由使用它。关于覆盖该方法,请确保您将要在测试中使用的方法和类公开 - 我的答案代码在 Xcode 中适用于我。
  • 我仍在尝试通过导入 FacebookSDK 和测试来解决错误,因此稍后我将再次测试您的代码,但我很确定我遇到了“SourceKitService Crashed”,类似于这个问题stackoverflow.com/questions/24006206/…
  • 那么在不为每个不同的模拟创建变量的情况下,您还能做些什么来测试方法调用?
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
相关资源
最近更新 更多