Creating a custom Laravel package using the orchestral/testbench package that helps package developer to help with PHPUnit test. So, my package on a different place and not in a Laravel installation exactly. Everything works great except the mix()
function that I’m using on the blade view for resources.
<script src="{{ asset(mix('js/app.js', 'vendor/trade')) }}"></script>
And, I have the following test route set in the web.php
:
<?php use IlluminateSupportFacadesRoute; Route::get('/', function() { return view('trade::_layouts.app'); });
In addition, I have the following feature test in the ExampleTest.php
file:
public function testBasicTest() { $response = $this->get('/'); $response->assertStatus(200); }
When I am running phpunit
I am seeing the following error:
Expected status code 200 but received 500. Failed asserting that false is true.
After dumping the $response
in the test, I see the The Mix manifest does not exist.
error. After digging for an hour I found that mix()
helper function is looking for the mix-manifest.json
in the orchestral/testbench
package located under the vendor
instead of the public
folder in my package.
I tried to the following in the package ServiceProvider.php
but didn’t work either:
$this->app->bind('path.public', function() { return base_path().'/../public'; });
In addition, I see the laravel/horizon
package also using the mix()
helper function on the layout.blade.php
file as I am doing right now and it is also using the orchestral/testbench
package for the test. So, how horizon package is doing the test while I can’t? What is the to override mix()
helper to ensure the public path is on my package public
path instead of the orchestral/testbench
path?
Advertisement
Answer
There are two ways to override the public_path()
returned path to ensure the mix()
function can find the mix-manifest.json
file.
- One would be to override the
public_path()
method completely to the custom package. Laravel usageif (!function_exists()) {}
before declaring any function which is good as we can define our ownpublic_path()
function in our package. However, we’ll need to make sure that our override function loads before the Laravel helper method and that’s another topic. - The easiest way would be to change the
path.public
from Laravel IoC Container from the particular PHPUnit test where we’re having the issue.
public function testBasicTest() { $this->app->instance('path.public', $packagePublicDir); $response = $this->get('/'); $response->assertStatus(200); }