Phpunit 如何在FuelPHP中以编程方式运行模块迁移?

Phpunit 如何在FuelPHP中以编程方式运行模块迁移?,phpunit,tdd,database-migration,fuelphp,Phpunit,Tdd,Database Migration,Fuelphp,对于我的一些测试,我需要使用setUpBeforeClass方法在存在的任何模块上运行迁移,并使用teardowneafterclass再次向下迁移模块。通过命令行,这很容易做到: oil r migrate --modules …运行模块迁移,然后: oil r migrate --modules --version=0 …重置它们。然而,在测试中,我需要以编程的方式来完成这项工作,并且我不知道如何使用FuelPHP的类来执行上述命令。latest和version方法似乎都要求您指定模块名

对于我的一些测试,我需要使用
setUpBeforeClass
方法在存在的任何模块上运行迁移,并使用
teardowneafterclass
再次向下迁移模块。通过命令行,这很容易做到:

oil r migrate --modules
…运行模块迁移,然后:

oil r migrate --modules --version=0

…重置它们。然而,在测试中,我需要以编程的方式来完成这项工作,并且我不知道如何使用FuelPHP的类来执行上述命令。
latest
version
方法似乎都要求您指定模块名称,但我只想迁移存在的任何模块。这可能吗?

您需要一些技巧才能使其正常工作

以下是石油的作用方式:

或者,您可以使用
Module::loaded()
获取加载的模块


然后,您可以为每个模块运行迁移。

迁移由
Migrate
类运行,因此,如果要运行迁移,您可以在代码中使用该类:

$results = Migrate::up(null, 'mymodulename', 'module');
与任务类似,您也可以使用down()和current()


请注意,这不会加载模块,因此如果您的模块迁移需要模块中的类,请确保首先加载模块

哈,真奇怪。你知道有没有一种方法可以通过Oil来实现吗?例如,
Oil\Refine::run('import',array('--modules')
?(我试过了,但似乎不起作用,但感觉可能有一种解决方案可以解决这些问题……)好吧,我不想弄乱Oil,但我确信导入不是迁移的任务名称,它是迁移。我宁愿跳过Oil,使用上面提到的方法:获取模块名称,并为每个模块调用迁移。或者,您也可以使用
exec
。啊,对不起,这是一个剪切粘贴错误。我的意思是
Oil\Refine::run('migrate',array('--module');
“import”是我写的一个任务,我在测试导入任务的一个测试中确实运行了类似的Oil,所以我知道它可以工作。但是不能让它与“migrate”一起工作……正如@WanWizard所说的,你应该在代码中使用migrate而不是hacking Oil。我很想!但我不知道如何-因此问题就来了:)不过,我不认为以编程方式调用Oil真的是“黑客攻击”它——我没有触及Oil代码库中的任何内容:只是调用其公开可用的方法。如果这样做行得通,我认为在测试的
设置
方法中这样做不一定有什么错-这就相当于运行一个oil命令。谢谢。问题是,您必须在这里命名模块,我想用一种通用的方式编写它(因为我想运行相同的测试套件,尽管可能存在不同的模块)。上面的oil命令似乎很好地做到了这一点——有没有一种方法可以使用Migrate实现同样的效果?(即,运行/恢复现有的任何模块迁移)请阅读我的答案。有办法。再次:获取所有模块的列表(常规)并为它们运行迁移。@mark.sagikazar:
module::load()
在我的情况下不起作用-它返回一个空数组-因为模块只包含一些特定于实例的迁移,而这些迁移不能在应用程序本身中进行。因此,模块实际上并没有加载到代码中。如何查看模块路径,如链接油参考中的路径?您可以重新创建oil在代码中执行的步骤。