伪造XCTest中Firebase实时数据库API的响应

我在工作中使用Firebase实时数据库,当我在寻找有关模拟使用Firebase实时数据库的单元测试时,发现了这篇文章(用日语编写)。

Firebase实时数据库をiOSで扱う际の模拟について考えてみた

松。松馆(@d_date)です。

medium.com

还写到,不仅仅是模拟实时数据库,而且它是如此有用。 这次,我试图考虑一种更简单的方法来模拟XCTest中的实时数据库的响应。 希望对不想做复杂事情的人有所帮助。

这个应用程式程式码的作用如下:

  • 正在将DatabaseRefenrece的实例传递给构造函数。
  • 使用observeSingleEvent API一次获取“样本”路径的数据。
  • 对响应中的快照进行一些操作,然后将结果传递给完成模块。

该应用程序的所有单元测试代码如下所示。 让我们一一看。

让我们从测试用例开始。 在第一行创建目标类的实例。 那时,将MockDatabaseReference(它是DatabaseReference类的模拟对象)作为构造函数参数传递。 稍后我将解释该模拟类。 此外,请使用XCTestExpectation,因为从实时数据库获取数据应该是异步操作。

这是之前提到的DatabaseReference类的模拟对象。 这次,应用程序代码使用了observeSingleEvent API,因此覆盖了该功能以及功能。

覆盖子函数的原因是,如果应用程序代码使用 API来请求特定的路径数据,则该API返回另一个新的DatabaseReference实例那么我们就无法模拟响应。 因此,这一次,覆盖 API并返回模拟对象本身,以便应用程序代码在实现模拟时可以请求任何路径。

如果要更改响应数据取决于请求的路径,则可以通过重写 API并为每个路径返回DatabaseReference的不同模拟对象,来做到这一点,如下所示:

最后,重写DataSnapshot类,它是实际的响应数据。 DataSnapshotvalue属性最初是只读属性,因此我们无法使其令人满意。 因此,重写它并返回我们要用作测试数据的数据。

通过在MockDatabaseReference类的observeSingleEvent中使用此MockSnapshot对象,我们最终可以使Firebase Realtime Database API根据需要返回数据。