伪造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类,它是实际的响应数据。 DataSnapshot的value属性最初是只读属性,因此我们无法使其令人满意。 因此,重写它并返回我们要用作测试数据的数据。
通过在MockDatabaseReference类的observeSingleEvent中使用此MockSnapshot对象,我们最终可以使Firebase Realtime Database API根据需要返回数据。