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

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

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

解决方法

正如你所说,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() {

    }

}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...