$plugin_id, 'configuration' => $configuration, ]; } /** * Generates a mocked FactoryInterface object with known properties. */ public function getMockFactoryInterface($expects_count) { $mock_factory = $this->getMockBuilder('Drupal\Component\Plugin\Factory\FactoryInterface') ->setMethods(['createInstance']) ->getMockForAbstractClass(); $mock_factory->expects($this->exactly($expects_count)) ->method('createInstance') ->willReturnCallback([$this, 'createInstanceCallback']); return $mock_factory; } /** * Tests createInstance() with no fallback methods. * * @covers ::createInstance */ public function testCreateInstance() { $manager = $this->getMockBuilder('Drupal\Component\Plugin\PluginManagerBase') ->getMockForAbstractClass(); // PluginManagerBase::createInstance() looks for a factory object and then // calls createInstance() on it. So we have to mock a factory object. $factory_ref = new \ReflectionProperty($manager, 'factory'); $factory_ref->setAccessible(TRUE); $factory_ref->setValue($manager, $this->getMockFactoryInterface(1)); // Finally the test. $configuration_array = ['config' => 'something']; $result = $manager->createInstance('valid', $configuration_array); $this->assertEquals('valid', $result['plugin_id']); $this->assertEquals($configuration_array, $result['configuration']); } /** * Tests createInstance() with a fallback method. * * @covers ::createInstance */ public function testCreateInstanceFallback() { // We use our special stub class which extends PluginManagerBase and also // implements FallbackPluginManagerInterface. $manager = new StubFallbackPluginManager(); // Put our stubbed factory on the base object. $factory_ref = new \ReflectionProperty($manager, 'factory'); $factory_ref->setAccessible(TRUE); // Set up the configuration array. $configuration_array = ['config' => 'something']; // Test with fallback interface and valid plugin_id. $factory_ref->setValue($manager, $this->getMockFactoryInterface(1)); $no_fallback_result = $manager->createInstance('valid', $configuration_array); $this->assertEquals('valid', $no_fallback_result['plugin_id']); $this->assertEquals($configuration_array, $no_fallback_result['configuration']); // Test with fallback interface and invalid plugin_id. $factory_ref->setValue($manager, $this->getMockFactoryInterface(2)); $fallback_result = $manager->createInstance('invalid', $configuration_array); $this->assertEquals('invalid_fallback', $fallback_result['plugin_id']); $this->assertEquals($configuration_array, $fallback_result['configuration']); } }