是否可以在 Laravel 项目中使用它自己的工厂中的模型?
Is it possible to use a model in it's own factory in a Laravel project?
我的团队正在构建一个使用 laravel 作为服务器代码的项目。早期我们打算使用模型来管理项目中使用的一些图像,但我们还没有来自客户的图像。所以我们构建了模型并使用 laravel 工厂和伪造者来创建用于测试的假图像。
一个月后(以及许多测试用例之后),我们收到了来自客户的实际图像。我将图像添加到项目中,创建了结构化数据库播种器来填充数据库所需的数据,并为模型编写了单元测试以确认它是否有效。
问题是现在一些测试失败了,因为我们用于图像模型的工厂仍然使用 factory 和 faker。我们需要使用我们从 faker 提供的虚假数据中获得的模型查找特定文件的任何地方。
我以为"well that's fine, I can just switch out the fake data in the factory for randomized data from the actual model"。我 运行 现在遇到的问题是,当我尝试在工厂函数中使用实际模型时,模型 class 仅作为工厂提供:
我知道幕后发生这种情况是有充分理由的,我只是想知道是否有办法解决这个问题。如果可以在工厂中使用实际模型,那么我就不必重写 lot 测试用例来将工厂换成实际模型。这似乎也是一种非常方便的方式,可以对您知道将存在但还没有实际资产的项目进行功能测试。
有没有办法解决这个问题,或者我应该计划认真对待并重构我的测试?
我相信如果你声明 class 对象作为 Faker class 在工厂声明中作为参数传递,你应该能够在工厂本身中使用它。不过我可能是错的,我相信它是这样发生的,因为工厂本身是一个函数调用,所以使用的任何参数都需要在其 function() 调用中事先声明。
如果我没记错的话,如果你这样做:
$factory->define(App\models\AreaOfAffectMap::class, function(AOA $AOA) {...
应该可以。
存在一个工厂,可以使用 fake 数据按需生成模型——不一定来自 faker,但数据不代表已经存在的实体。您正在尝试创建依赖于已填充真实数据的数据库的工厂,但是如果您有一个包含需要测试的真实数据的数据库,那么您应该直接使用该数据。您的方法将使测试依赖于真实数据,这些数据现在需要分发给所有开发人员并构建服务。
应使用 Database Seeders 使用一组固定数据填充数据库以进行测试。在开发开始时,你应该创建一个数据库播种器(可以使用工厂)来用假数据填充你的数据库,然后一旦你获得真实数据,你就可以添加一个额外的数据库播种器(或直接从 Laravel 如有必要)。这种方法意味着您的应用程序可以在不关心数据是否真实的情况下进行测试,并且您将继续能够按预期使用工厂。
这里的不幸结论是,如果您希望您的测试具有弹性,您将需要重构。
如果您绝对必须使用具有真实数据的工厂,那么您可以 create your own faker provider 如果数据不存在,则可以进行回退。
我的团队正在构建一个使用 laravel 作为服务器代码的项目。早期我们打算使用模型来管理项目中使用的一些图像,但我们还没有来自客户的图像。所以我们构建了模型并使用 laravel 工厂和伪造者来创建用于测试的假图像。
一个月后(以及许多测试用例之后),我们收到了来自客户的实际图像。我将图像添加到项目中,创建了结构化数据库播种器来填充数据库所需的数据,并为模型编写了单元测试以确认它是否有效。
问题是现在一些测试失败了,因为我们用于图像模型的工厂仍然使用 factory 和 faker。我们需要使用我们从 faker 提供的虚假数据中获得的模型查找特定文件的任何地方。
我以为"well that's fine, I can just switch out the fake data in the factory for randomized data from the actual model"。我 运行 现在遇到的问题是,当我尝试在工厂函数中使用实际模型时,模型 class 仅作为工厂提供:
我知道幕后发生这种情况是有充分理由的,我只是想知道是否有办法解决这个问题。如果可以在工厂中使用实际模型,那么我就不必重写 lot 测试用例来将工厂换成实际模型。这似乎也是一种非常方便的方式,可以对您知道将存在但还没有实际资产的项目进行功能测试。
有没有办法解决这个问题,或者我应该计划认真对待并重构我的测试?
我相信如果你声明 class 对象作为 Faker class 在工厂声明中作为参数传递,你应该能够在工厂本身中使用它。不过我可能是错的,我相信它是这样发生的,因为工厂本身是一个函数调用,所以使用的任何参数都需要在其 function() 调用中事先声明。
如果我没记错的话,如果你这样做:
$factory->define(App\models\AreaOfAffectMap::class, function(AOA $AOA) {...
应该可以。
存在一个工厂,可以使用 fake 数据按需生成模型——不一定来自 faker,但数据不代表已经存在的实体。您正在尝试创建依赖于已填充真实数据的数据库的工厂,但是如果您有一个包含需要测试的真实数据的数据库,那么您应该直接使用该数据。您的方法将使测试依赖于真实数据,这些数据现在需要分发给所有开发人员并构建服务。
应使用 Database Seeders 使用一组固定数据填充数据库以进行测试。在开发开始时,你应该创建一个数据库播种器(可以使用工厂)来用假数据填充你的数据库,然后一旦你获得真实数据,你就可以添加一个额外的数据库播种器(或直接从 Laravel 如有必要)。这种方法意味着您的应用程序可以在不关心数据是否真实的情况下进行测试,并且您将继续能够按预期使用工厂。
这里的不幸结论是,如果您希望您的测试具有弹性,您将需要重构。
如果您绝对必须使用具有真实数据的工厂,那么您可以 create your own faker provider 如果数据不存在,则可以进行回退。