Fandom

Wikia Developers Wiki

Nirvana/WikiaBaseTest

< Nirvana

889pages on
this wiki
Add New Page
Talk0 Share

WikiaBaseTest

class WikiaBaseTest extends PHPUnit_Framework_TestCase {...}

This documentation provides examples for Wikia's Base Test class. It has some helpers to make it easier to work with $wf, $wg and other Nirvana features in unit tests. All test classes should extend WikiaBaseTest.

setUp

protected function setUp() {...}

The setUp function initializes $app and $appMock and loads the setupFile for the extension if it has one. Most extensions do, and we used to have a hardcoded include_once at the top of every file. This has been moved into the BaseTest, so you just have to define your local setupFile variable and it will be loaded for you. Always call the parent::setUp function.

// Example of usage in your own extension
public function setUp() {
	$this->setupFile =  dirname(__FILE__) . '/../MyExtension_setup.php';
	parent::setUp();
}

mockClass (deprecated)

protected function mockClass($className, $mock) {...}

The mockClass function basically just calls F::setInstance( $className, $mock ) for you. Since we are deprecating usage of F::build and F::setInstance, this method should also be considered deprecated.

proxyClass (replaces mockClass)

protected function proxyClass($className, $mock, $functionName = null) {...}

The proxyClass function creates a WikiaMockProxy object and overloads the built in PHP "new" function (see the code for more extensive documentation). This allows you to mock an object which is created by a "new" call in your code. In general we should use dependency injection or some other technique to make code more testable, this is a work-around. The only limitation right now is that you can only have one Proxy object per "class". So, you can have a TitleProxy and a UserProxy, but not two different values for Title. Example usage:

$mockArticle = $this->getMock('Article', array('getTitle'), array($mockTitle));
$mockArticle->expects($this->any())
            ->method('getTitle')
            ->will($this->returnValue($mockTitle));
$this->proxyClass('Article', $mockArticle, 'newFromID');
// now anything in your code that calls "Article::newFromID" receives your mock object
  • TODO: we figured out how to make this work with more than one instance, we just have to do it

mockClassWithMethods

protected function mockClassWithMethods($className, Array $methods = array(), $staticConstructor = '') {...}

The mockClassWithMethods function calls proxyClass, passes in an array of methods (and optionally a static constructor) and sets up all the mocked methods for you, hopefully eliminating some boilerplate code. It does not otherwise do something useful for you so you have to use the returned mock for something yourself. Example usage:

$mockTitle = $this->mockClassWithMethods('Title', array('exists' => false), 'newFromText');
$this->mockGlobalVariable('wgTitle', $mockTitle);
  • TODO: we should rename this to proxyClassWithMethods since that's what it does
  • TODO: Robert recommends using the PHPUnit MockBuilder fluent interface instead of this, write up how

mockGlobalVariable

protected function mockGlobalVariable( $globalName, $returnValue ) {...}

Helper function to mock a global variable. This only works if you use $this->wg in your code.

$wgRequest = $this->getMock('WebRequest', array('getInt', 'getArray'));
// set up wgRequest
$this->mockGlobalVariable('wgRequest', $wgRequest);
 
// you don't have to just mock objects:
$this->mockGlobalVariable( 'wgCityId', self::TEST_CITY_ID );

mockGlobalFunction

protected function mockGlobalFunction( $functionName, $returnValue, $callsNum = 1, $inputParams = array() ) {...}

Helper function to mock a global function.

$this->mockGlobalFunction( 'getDB', $dbMock );
 
// mockMessage only overloads the "msg" function so you might have to do this:
$this->mockGlobalFunction( 'MsgExt', $expMsg, $mockMsgExtCount );

mockStaticClassMethod

protected function mockClassStaticMethod($className, $methodName, $retVal) {...}

Helper function to mock a static method of an object.

// mock API response
$respMock = json_encode(array(
    'response' => array(
    'code' => $apiResponse
)));
$this->mockClassStaticMethod('Http', 'post', $respMock);

mockMessage

protected function mockMessage($messageName, $messageContent) {

This just calls mockGlobalFunction for "msg".

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.