XCTest期望使用swift进行方法调用

Rod*_*uiz 7 ocmock ios xctest swift ios8

如何编写一个使用swift和XCTest进行方法调用的测试?

我可以使用OCMock,但他们并没有正式支持swift,所以没有多少选择.

e19*_*985 4

正如您所说,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)
    }

}
Run Code Online (Sandbox Code Playgroud)

MyClass.swift

public class MyClass {

    let myService: MyService

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

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

}
Run Code Online (Sandbox Code Playgroud)

MyService.swift

public class MyService {

    public init() {

    }

    public func doSomething() {

    }

}
Run Code Online (Sandbox Code Playgroud)