【问题标题】:Mocking in Swift for XCTest在 Swift 中模拟 XCTest
【发布时间】:2016-07-19 15:10:41
【问题描述】:

我正在为我的项目编写测试用例,其中混合了 Objective C 和 Swift 代码。我知道 OCMock 框架,我以前用它来模拟/存根以在 Objective C 中编写测试用例。 但是我搜索了一下,发现它并不完全支持 swift,因为它是基于 Objective C 运行时的。 我正在尝试用 swift 语言编写测试用例。有没有办法我可以为服务级别层进行模拟/存根。例如。

 func getPersonData(id:String, success: (ReponseEnum) -> Void, failure: (error: NSError) -> Void) {


                let requestPara:NSDictionary =  ["id": id]

                let manager: MyRequestManager = MyRequestManager.sharedManager()

                //MyRequestManager is nothing but AFNetworking class 
                let jsonRequest
                /// Service request creation code here


                // Service Call

                manager.POST(url, parameters: jsonRequest, success: { (task: NSURLSessionDataTask!, responseObject: AnyObject!) -> () in

                    // Some business logic
                    //success block call
                    success (successEnum)



                }) {(task: NSURLSessionDataTask!, error: NSError!) -> () in

                    // failure block call
                    failure (failureEnum)

                }
    }

这里如何模拟虚拟 responseObject 的 post 方法调用所以我可以编写测试用例?

【问题讨论】:

  • 这里我们只是在需要时创建自己的模拟对象。到目前为止,我们还没有找到一个“工具”来为我们做这件事,而且它实际上相当简单。对于存根网络调用,我们使用 Mockingjay --> github.com/kylef/Mockingjay

标签: ios swift swift2 xctest


【解决方案1】:

您需要使用依赖注入才能模拟POST方法。

您定义getPersonData(id:success:failure) 方法的类需要在构造函数中接受 MyRequestManager 作为参数:

class MyClass {
    private let requestManager: MyRequestManager

    init(requestManager: MyRequestManager) {
        self.requestManager = requestManager
    }
}

然后你为你的请求管理器创建一个模拟:

class MockMyRequestManager: MyRequestManager {

   // not sure about correct method signature
   override func POST(url: NSURL, parameters: [String: AnyObject], success: (() -> Void)?) {
       //implement any custom logic that you want to expect when executing test
   }
}

在测试中,你用一个模拟来初始化你的类:

let myClass = MyClass(requestManager: MockMyRequestManager())

您可以在此处找到有关依赖注入的更多详细信息: http://martinfowler.com/articles/injection.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2014-08-02
    • 1970-01-01
    • 2016-10-22
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多