Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Swift中模拟第三方类(Firebase)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试单独测试我自己的一个类,它正在调用第三方类的方法: FIRAuth.auth()?.signInAnonymously() { (user, error) in // } 我正在使用基于协议的依赖注入来实现这一点: protocol FIRauthprotocol { func signInAnonymously(completion: FIRAuthResultCall
我正在尝试单独测试我自己的一个类,它正在调用第三方类的方法
FIRAuth.auth()?.signInAnonymously() { (user,error) in
    //
}

我正在使用基于协议的依赖注入来实现这一点:

protocol FIRauthprotocol {
    func signInAnonymously(completion: FIRAuthResultCallBACk?)
}
extension FIRAuth: FIRauthprotocol {}

class MyClass {
    private var firAuth: FIRauthprotocol

    init(firAuth: FIRauthprotocol) {
        self.firAuth = firAuth
    }

    func signIn() {
        firAuth.signInAnonymously() { (user,error) in
            //
        }
    }
}

class mockFIRAuth: FIRauthprotocol {
    var signInAnonymouslyCalled = false

    func signInAnonymously(completion: FIRAuthResultCallBACk? = nil) {
        signInAnonymouslyCalled = true
    }

}

class MyClassSpec: QuickSpec {
    override func spec() {
        describe("MyClass") {
            describe(".signIn()") {
                it("should call signInAnonymously() on firAuth") {
                    let mockFIRAuth = mockFIRAuth()
                    let myClass = MyClass(firAuth: mockFIRAuth)
                    expect(mockFIRAuth.signInAnonymouslyCalled).to(befalse())
                    myClass.signIn()
                    expect(mockFIRAuth.signInAnonymouslyCalled).to(beTrue())
                }
            }
        }
    }
}

到现在为止还挺好!
现在,我希望我的mockFIRAuth返回FIRUser的一个实例.
这是我的问题:我自己无法创建FIRUser的实例.

仅供参:公共类型FIRAuthResultCallBACk =(FIRUser?,错误?) – > Swift.Void

如果发现这篇很棒的文章解释了如何在第三方类上创建一个方法而不是一个类型. http://masilotti.com/testing-nsurlsession-input/
也许我的情况与文章的情况不同,但这是我对此的看法:

我已经定义了FIRUserProtocol:

protocol FIRUserProtocol {
    var uid: String { get }
}
extension FIRUser: FIRUserProtocol {}

我更新了FIRauthprotocol以使用FIRUserProtocol而不是FIRUser调用完成处理程序:

protocol FIRauthprotocol {
    func signInAnonymously(completion: ((FIRUserProtocol?,Error?) -> Void)?)
}

我更新了FIRAuth扩展以支持修改后的协议.我新定义的方法调用signInAnonymously的认实现:

extension FIRAuth: FIRauthprotocol {
    func signInAnonymously(completion: ((FIRUserProtocol?,Error?) -> Void)? = nil) {
        signInAnonymously(completion: completion)
    }
}

最后,我更新了mockFIRAuth以支持修改后的协议:

class mockFIRAuth: FIRauthprotocol {
    var signInAnonymouslyCalled = false
    func signInAnonymously(completion: ((FIRUserProtocol?,Error?) -> Void)? = nil) {
        signInAnonymouslyCalled = true
    }  
}

现在,当我运行我的测试时,一切都停止了:


线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fff586a2ff8)

请指教!

更新

在我的FIRauthprotocol方法重命名完成参数标签后,一切似乎都按预期工作:

protocol FIRauthprotocol {
    func signInAnonymously(completionWithProtocol: ((FIRUserProtocol?,Error?) -> Void)?)
}

extension FIRAuth: FIRauthprotocol {
    func signInAnonymously(completionWithProtocol: ((FIRUserProtocol?,Error?) -> Void)? = nil) {
        signInAnonymously(completion: completionWithProtocol)
    }
}

解决了我现在的问题,但我仍然想知道为什么我的第一次尝试不成功.这是否意味着它们的闭包中具有不同参数类型的两个方法不能被分开,这导致我的应用程序崩溃?

我终于找到了解决这个问题的优雅方法.
protocol FIRauthprotocol {
    func signInAnonymously(completion: ((FIRUserProtocol?,Error?) -> Void)?)
}

extension FIRAuth: FIRauthprotocol {
    func signInAnonymously(completion: ((FIRUserProtocol?,Error?) -> Void)? = nil) {
        let completion = completion as FIRAuthResultCallBACk?
        signInAnonymously(completion: completion)
    }
}

这样,就不需要改变函数名称或参数标签.

大佬总结

以上是大佬教程为你收集整理的在Swift中模拟第三方类(Firebase)全部内容,希望文章能够帮你解决在Swift中模拟第三方类(Firebase)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。