是否可以在Laravel项目中使用模型自己的工厂?

时间:2018-04-04 14:26:12

标签: php laravel factory faker

我的团队正在使用laravel为服务器代码构建一个项目。早期我们将使用模型来管理项目中使用的一些图像,但我们还没有来自客户端的图像。因此,我们建立了模型并使用了laravel工厂和faker来创建用于测试的假图像。

一个月后(以及之后的许多测试用例)我们从客户端获得实际图像。我将图像添加到项目中,创建结构化数据库播种器以填充数据库所需的数据,并为模型写出单元测试以确认其有效。

现在的问题是,现在有些测试失败了,因为我们用于图像模型的工厂仍然使用工厂和制造商。在我们需要使用模型查找特定文件的任何地方,我们都会从faker提供的假数据中失败。

我认为这很好,我可以在工厂中为实际模型中的随机数据切换假数据"。我现在遇到的问题是,当我尝试在工厂函数中使用实际模型时,模型类仅作为工厂提供:

getting the class of the model

我知道幕后发生这种情况的理由很充分,我只是想知道是否有办法解决这个问题。如果可以在工厂中使用实际模型,则可以防止我不得不重写测试用例的批次来换出实际模型的工厂。这似乎是一种非常方便的方法,可以对您知道存在但尚未拥有实际资产的项目进行功能测试。

有没有办法解决这个问题,还是应该计划对我的测试进行修改和重构?

2 个答案:

答案 0 :(得分:0)

我相信如果您声明类对象,因为Faker类作为工厂声明中的参数传递,您应该能够在工厂本身内使用它。我可能错了,我相信它会发生这种情况,因为工厂本身是一个函数调用,因此所有使用的参数都需要在其function()调用之前声明。

如果我没记错的话,如果你这样做:

  

$ factory-> define(App \ models \ AreaOfAffectMap :: class,function(AOA $ AOA){...

它应该有用。

答案 1 :(得分:0)

存在使用数据按需生成模型的工厂 - 不一定来自faker,而是代表已经存在的实体的数据。您正在尝试创建依赖于已填充实际数据的数据库的工厂,但如果您有一个需要测试的真实数据的数据库,那么您应该直接使用该数据。您的方法会使测试依赖于实际数据,现在需要将其分发给所有开发人员并构建服务。

使用Database Seeders使用一组固定数据填充数据库进行测试。在开发开始时,您应该创建一个数据库播种器(可以使用工厂)用假数据填充数据库,然后一旦获得真实数据,就可以添加一个额外的数据库播种器(或直接从Laravel外部填充数据库)如有必要)。这种方法意味着您的应用程序可以在不关心数据是否真实的情况下进行测试,并且您可以继续使用工厂,因为它们是打算使用的。

这里不幸的结论是,如果你希望你的测试具有弹性,你将需要重构。

如果您绝对必须使用具有真实数据的工厂,那么如果数据不存在,您可以create your own faker provider具有后备。

相关问题