简体   繁体   中英

Laravel Testing Service Dependency Injection Error

To start from the conclusion, I get this error:

[ErrorException]                                                                                                                                                                                    
Argument 1 passed to SomeValidatorTest::__construct() must be an instance of App\Services\Validators\SomeValidator, none given, called in ....vendor/phpunit/phpunit/src/Framework/TestSuite.php on line 475 and defined  

In Laravel app, I have a script called "SomeValidator.php" which looks like this:

<?php namespace App\Services\Validators;

use App\Services\SomeDependency;

class SomeValidator implements ValidatorInterface
{

    public function __construct(SomeDependency $someDependency)
    {
        $this->dependency = $someDependency;
    }

    public function someMethod($uid)
    {
       return $this->someOtherMethod($uid);
    }

}

which runs without error.

Then the test script, SomeValidatorTest.php looks like this:

<?php

use App\Services\Validators\SomeValidator;


class SomeValidatorTest extends TestCase
{
    public function __construct(SomeValidator $validator)
    {
        $this->validator = $validator;
    }

    public function testBasicExample()
    {
        $result = $this->validator->doSomething();
    }
}

The error shows up only when the test script is ran through './vendor/bin/phpunit' The test class seems to be initiated without the dependency stated and throws an error. Does anyone know how to fix this? Thanks in advance.

You cannot inject classes into the tests (as far as i know), given that they are not resolved automatically by laravel/phpUnit.

The correct way is to make (resolve) them through laravel's app facade. Your test script should look like this:

<?php

class SomeValidatorTest extends TestCase
{
    public function __construct()
    {
        $this->validator = \App::make('App\Services\Validators\SomeValidator');
    }

    public function testBasicExample()
    {
        $result = $this->validator->doSomething();
    }
}

Source: http://laravel.com/docs/5.1/container

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM