Symfony 3.4 无法在测试中加载装置:错误:在 null 上调用成员函数 get()

迪米特里奥斯·德西拉斯

我有以下 phpunit 测试来测试控制器:

DefaultControllerTest

namespace Tests\AppBundle\Controller;

use Tests\AppBundle\Controller\BasicHttpController;
use AppBundle\DataFixtures\Test\DummyUserFixtures;

/**
* @testtype Functional
*/
class DefaultControllerTest extends BasicHttpController
{
    /**
    * {@inheritdoc}
    */
    public function setUp()
    {
        $fixture = new DummyUserFixtures();
        $fixture->load($this->entityManager);
    }

    /**
    * Testing the Behavior when visiting the index page
    */
    public function testIndex()
    {
        $client = $this->client;
        $router=$client->getContainer()->get('router');
        $crawler = $client->request('GET', '/');
        $response=$client->getResponse();
        $this->assertTrue($client->getResponse()->isRedirect());
        $this->assertEquals($router->getRouteCollection()->get('fos_user_security_login')->getPath(),$response->headers->get('Location'));

        //@todo Create Dummy Users
        // $this->checkPanelAfterSucessfullLogin($crawler);
    }
}

这扩展了以下测试BasicHttpController(尝试应用 DRY 原则):

namespace Tests\AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;

class BasicHttpController extends WebTestCase
{
    protected $entityManager=null;

    protected $client=null;

    /**
    * {@inheritdoc}
    */
    public function __construct()
    {
        parent::__construct();
        $this->client = static::createClient();
        $container = $this->client->getContainer();
        $doctrine = $container->get('doctrine');
        $this->entityManager=$doctrine->getManager();
    }

    /**
    * Remove all entities from the database
    */
    protected function truncateEntities()
    {
        $purger = new ORMPurger($this->entityManager());
        $purger->purge();
    }


    /**
    * {@inheritdoc}
    */
    public function tearDown()
    {
        $this->truncateEntities();
    }

    /**
    * @param username String the user's username
    * @param passwoρd String the user's password
    */
    protected function checkPanelAfterSucessfullLogin($crawler,string $username,string $password)
    {
        //Submitting the form
        $form=$crawler->selectButton('_submit')->form();
        $form['_username']=$username;
        $form['_password']=$password;

        $crawler=$crawler->submit($form);
        $response=$client->getResponse();
        $this->assertTrue($client->getResponse()->isRedirect());
        $client->followRedirect();

        //Checking header
        $headerDom=$crawler->filter('header')->childen()->filter('nav.navbar')->children();
        $this->assertCount(1,$headerDom->find('a.navbar-brand')); //homepage link
        $this->assertCount(1,$headerDom->find('a.btn-danger')); //Logout button
    }
}

如您所见,我尝试加载以下夹具:

namespace AppBundle\DataFixtures\Test;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\Common\Persistence\ObjectManager;

class DummyUserFixtures extends AbstractFixture implements OrderedFixtureInterface,ContainerAwareInterface
{

    /**
    * @var ContainerInterface
    */
    private $container=null;


    /**
    * {@inheritDoc}
    */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    /**
    * Generic function that creates a user with provided information.
    * @param $name {String} The user's name
    * @param $surname {String} The user's surname
    * @param $username {String} The user's username
    * @param $password {String} The user's password
    * @param $email {String} The user's recovery email
    * @param $role {String} The user's system role
    * @param $phone {String | null} The user's phone number
    * @param $organization {String|null} The user's organization
    * @param $occupation {String|null} The user's occupation
    *
    * @return AppBundle\Entity\User
    */
    private function createUser($name,$surname,$username,$password,$email,$role,$phone=null,$organization=null,$occupation=null)
    {
        $fosUserManager=$this->container->get('fos_user.user_manager');

        /**
        * @var AppBundle\Entity\User
        */
        $user=$fosUserManager->createUser();
        $user->setUsername($username);
        $user->setEmail($email);
        $user->setPlainPassword($password);
        $user->setEnabled(true);
        $user->setRoles(array($role));

        $user->setName($name);
        $user->setSurname($surname);

        if($phone){
            $user->setPhone($phone);
        }

        if($organization){
            $user->setOrganization($organization);
        }

        if($occupation){
            $user->setOccupation($occupation);
        }

        $fosUserManager->updateUser($user, true);

        return $user;
    }

    /**
    * {@inheritDoc}
    */
    public function load(ObjectManager $manager)
    {
        $this->createUser('John','Doe','jdoe','simplepasswd','[email protected]','ROLE_USER','+3021456742324','Acme Products','Soft Engineer');
        $this->createUser('Jackie','Chan','jchan','thesimplepasswd','[email protected]','ROLE_ADMIN','+302141232324','Holywood','Actor');
        $this->createUser('Chuck','Norris','chuck_norris','unhackablepasswd','[email protected]','ROLE_SUPERADMIN',null,'Universe','Master');
    }

    public function getOrder()
    {
       return 1;
    }
}

但由于某种原因,我收到以下错误:

有 1 个错误:

1) Tests\AppBundle\Controller\DefaultControllerTest::testIndex 错误:在 null 上调用成员函数 get()

/home/vagrant/code/src/AppBundle/DataFixtures/Test/DummyUserFixtures.php:50 /home/vagrant/code/src/AppBundle/DataFixtures/Test/DummyUserFixtures.php:87 /home/vagrant/code/tests/AppBundle /Controller/DefaultControllerTest.php:19

进一步调试证明,该错误是由 中的以下行触发的DummyUserFixtures

    $fosUserManager=$this->container->get('fos_user.user_manager');

那么你知道如何通过fixtures加载数据吗?

迪米特里奥斯·德西拉斯

为了让它工作,你应该设置你从static::createClient()方法生成的服务容器并通过$fixture->setContainer($container)

因此,一个好的方法是将容器定义为受保护的实例变量,BasicHttpController以便任何 Test 类(例如DefaultControllerTest在您的情况下)能够相应地加载夹具。

所以使用的setUp方法和实例变量BasicHttpController应该如下:

//Namespace declaration goes there

class BasicHttpController extends WebTestCase
{
    protected $entityManager=null;

    protected $client=null;

    protected $container=null;

    /**
    * {@inheritdoc}
    */
    public function setUp()
    {
        $this->client = static::createClient();
        $this->container = $this->client->getContainer();
        $doctrine = $this->container->get('doctrine');
        $this->entityManager=$doctrine->getManager();
    }

    // Rest methods here
}

注意:在继承自的类上,BasicHttpController您可以定义setUp如下:

public function setUp()
{
   parent::setUp();
   // Add extra stuff here
}

所以你可以在测试之前做更多的 setUp 引导。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Symfony FOSRestBundle 错误:在 null 上调用成员函数 get()。[路由或配置错误]

Symfony登录表单—致命错误:在null上调用成员函数get()

在null,Symfony 4上调用成员函数encodePassword()

在symfony4中的null上调用成员函数setDp()

symfony 和棘轮在 null 上调用成员函数 get()

Symfony 2错误:在非对象上调用成员函数get()

Symfony:错误:在非对象上调用成员函数get()

错误:在数组 Symfony 3 上调用成员函数 contains()

Codeigniter 3致命错误:在null上调用成员函数database()

错误:在 null 上调用成员函数 setPayrollperiodid()

错误:在null上调用成员函数add()

CodeIgniter错误-在null上调用成员函数

如何修复 WooCommerce 中的“未捕获错误:在 null 上调用成员函数 get_tax_class()”?

未捕获的错误:在 null 上调用成员函数 get()(简易摄影插件 Wordpress)

在非对象上调用成员函数get()-Symfony和Silex

在空“ Symfony Php”上调用成员函数get()

在第4行的null上调用成员函数is_loggedin()

在 null 上调用成员函数 get(),如何解决?

在null上调用成员函数get_cart_contents_count()

Laravel-错误:在null上调用成员函数fullName()

PHP CURL致命错误:在null上调用成员函数getAttribute()

错误消息:在null上调用成员函数render()

登录时出现错误“在 null 上调用成员函数 prepare()”

致命错误:在null上调用成员函数hasAttribute()

PHP - 在 null 上调用成员函数 query() - 错误

如何修复“在null上调用成员函数update()”错误?

错误:在Drupal 8中在null上调用成员函数uuid()

致命错误:在null上调用成员函数prepare()

致命错误:在null上调用成员函数query()