Dynamic Config Values for Each PHPUnit Test Case in Laravel

The Problem:

I am currently working on a USSD application that supports switching between different gateway providers at runtime by changing a configuration value.

Testing each provider test case was simple and straight forward. I would update the value in my phpunit.xml file and off I go. However, I ran into problems when I wanted to run my entire test suite.

The Solution:

It turns out the solution is quite a simple one: Facades. Laravel allows one to mock any Facade when writing your tests. The documentation however, discourages from mocking the Config facade. Instead one should use the Config::set method.

So, I did something along the lines of the code below.

<?php
// define your namespace and dependencies here

use Illuminate\Support\Facades\Config;

class GatewayProviderOneTest extends TestCase
{
	public function setUp ()
	{
		parent::setUp();
		Config::set("defaultGatewayProvider", "firstProvider");
	}

	// ... your test methods come here
}

That’s all I needed. Now GatewayProviderOneTest will run its assertions against the value set as the defaultGatewayProvider: firstProvider.

Additionally, you can revert this to a default value every time in your tearDown method. I however didn’t have the need for this.