Wim Pruiksma
Wim Pruiksma

Reputation: 598

Passing variables in phpunit

I'm trying to pass an array i created in my testcase into my function i want to test. Is it possible to create a vairable in the testcase and pass or mock it to the class/function i want to test?

is it possible to use something like this:

$this->object = array(//array code here);
$this->testclass->attachVar->getAllObjects($this->objects);

Here is my code:

class myClassTest extends \PHPUnit_Framework_TestCase {

protected function setUp(){
    $this->testclass = new \stdClass();
    $this->testclass = $this->getMockBuilder('library\ixPlanta\plantChange', $this->object)
                 ->disableOriginalConstructor()                     
                 ->getMock();
}
public function testGetAllObjects() {

   $this->object = array(
                'testdb'        => array(
                    'testdb_michel' => array(
                        'dbname'        => 'testdb',
                        'projectName'   => 'testdb',
                        'projectID'     => 'bd993d2b9478582f6d3b73cda00bd2a',
                        'mainProject'   => 'test',
                        'search'        => false,
                        'webgroup'      => array(),
                        'locked'        => false
                    )
                )
            );


    $this->testclass->expects($this->once())
            ->method('GetAllObjects')
            ->with('testdb', false, "CHECKED")
            ->injectTo('object', $this->object)
            ->will();


  $result = $this->testclass->getAllObjects('testdb', false, "CHECKED");
  $this->assertTrue($result);

    }

In the function testGetAllObjects() i created an array that i want to pass to the function i want to test

public function getAllObjects($company,$selected=false,$selectText='CHECKED'){
    $objList = array();
    $i = 0;
    foreach($this->Objects[$company] as $key => $value){
        $objList[$i] = array('value'=> $key,'name' => $value['projectName'], 'objectID' => $value['projectID']);
        $objList[$i]['checked'] = '';
        if($selected !== false && !is_array($selected) && $selected === $value['dbname']){
            $objList[$i]['checked'] = $selectText;
        }elseif($selected !== false && is_array($selected) && in_array($value['dbname'], $selected)){
            $objList[$i]['checked'] = $selectText;
        }
        ++$i;
    }
    return $objList;
}

The variable i want to pass to getAllObjects is $this->objects

Upvotes: 1

Views: 2705

Answers (1)

StoryTeller
StoryTeller

Reputation: 1748

I think you misunderstood mock objects. The purpose of mock objects is, to create a dummy object for any other class you don't want to test. Mocking a method means, to prevent another class from calling its actual logic. Instead, it is not executed and the mock just returns whatever you gave it.

To test your actual class you just instantiate it and call its method:

class myClassTest extends \PHPUnit_Framework_TestCase
{

    protected function setUp()
    {
        $this->testclass = new MyClass();
    }

    public function testGetAllObjects()
    {

        $this->testclass->object = array(
            'testdb' => array(
                'testdb_michel' => array(
                    'dbname'      => 'testdb',
                    'projectName' => 'testdb',
                    'projectID'   => 'bd993d2b9478582f6d3b73cda00bd2a',
                    'mainProject' => 'test',
                    'search'      => false,
                    'webgroup'    => array(),
                    'locked'      => false
                )
            )
        );

        $result = $this->testclass->getAllObjects('testdb', false, "CHECKED");
        $this->assertTrue($result);

    }
}

Example of a mock:

Let's say your class contains some other object of the class Service which is injected through the constructor:

class MyClass {

    protected $service;

    public function __construct(Service $service) {
        $this->service = $service;
    }

    public function myMethod($argument) {
        $return = $this->service->callService($argument);
        return $return;
    }

}

And your Service object is something like this:

class Service{

    public function callService($argument) {
        if($argument === NULL) {
            throw new \Exception("argument can't be NULL");
        }
        return true;
    }

}

Now you could test MyClass with this method:

public function testMyClassMethod() {
    $serviceMock = $this->getMockBuilder("Service")->getMock();
    $serviceMock->expects($this->any())
        ->method("callService")
        ->will($this->returnValue(true));

    $myClass = new MyClass($serviceMock);

    $this->assertTrue($myClass->myMethod(NULL));
}

myMethod will still return true, although Service would normally throw an Exception if $argument is NULL. But because we mocked the method, it is never actually called and the mock object will return whatever we provided in ->will($this->returnValue()).

Upvotes: 4

Related Questions