Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一个单元如何测试在循环中创建对象的函数?_Php_Unit Testing - Fatal编程技术网

Php 一个单元如何测试在循环中创建对象的函数?

Php 一个单元如何测试在循环中创建对象的函数?,php,unit-testing,Php,Unit Testing,我一直在尝试解耦依赖项,以便可以在类中对函数进行单元测试,但我遇到了一个问题,即我有一个函数可以循环遍历一个数据数组,并根据数据创建新对象。新对象对数据执行插入操作 如何编写此函数,以便模拟要在循环中创建的对象 public function createObjects($array_of_data) { $new_objects = []; foreach($array_of_data as $data) { //do some stuff with the

我一直在尝试解耦依赖项,以便可以在类中对函数进行单元测试,但我遇到了一个问题,即我有一个函数可以循环遍历一个数据数组,并根据数据创建新对象。新对象对数据执行插入操作

如何编写此函数,以便模拟要在循环中创建的对象

public function createObjects($array_of_data)
{
   $new_objects = [];

   foreach($array_of_data as $data)
   {
       //do some stuff with the data
       $new_object = new newObject($data);
       $new_object->saveToDB();
       $new_objects[] = $new_object;
   }

   return $new_objects;
}

我建议创建一个新的工厂类,将该类注入
createObjects()
方法(或通过该类的构造函数,或通过setter方法),然后在测试
createObjects()
时模拟该工厂

这里有一个简单的例子。请务必注意
YourClass::createObjects()
方法中的
FactoryInterface
typehint,它使所有这些成为可能:

interface FactoryInterface
{
    public function createObject($data);
}

class ObjectFactory implements FactoryInterface
{
    public function createObject($data)
    {
        return new newObject($data);
    }
}

class YourClass
{
    public function createObjects($array_of_data, FactoryInterface $objectFactory)
    {
        $new_objects = [];
        foreach ($array_of_data as $data) {
            $new_objects[] = $objectFactory->createObject($data);
        }
        return $new_objects;
    }
}

class MockObjectFactory implements FactoryInterface
{
    public function createObject($data)
    {
        // Here, you can return a mocked newObject rather than an actual newObject
    }
}

class YourClassTest extends PHPUnit_Framework_TestCase
{
    public function testCreateObjects()
    {
        $classUnderTest = new YourClass();
        $new_objects    = $classUnderTest->createObjects(
            [1, 2, 3], // Your object initialization data.
            new MockObjectFactory()
        );
        // Perform assertions on $new_objects
    }
}

谢谢,我就知道我快到了。我应该记得我可以上工厂班。我使用的是Pimple dependency injector类,所以设置起来应该很简单。