Installation:
composer require worksome/request-factories
No additional configuration is required—just use the RequestFactory facade or helper methods.
First Use Case: Replace verbose test assertions with a focused factory for a single request field.
use Worksome\RequestFactories\Facades\RequestFactory;
it('validates phone number format', function () {
$request = RequestFactory::create('App\Http\Requests\StoreUserRequest')
->with('phone', '+375 154 767 1088');
$response = $this->post('/users', $request->toArray());
$response->assertValid();
});
Where to Look First:
RequestFactory facade methods (create(), with(), toArray()).tests/ directory for advanced patterns.Factory Creation:
$request = RequestFactory::create(StoreUserRequest::class);
FormRequest class name.Field Overrides:
$request->with('email', 'test@example.com')
->with('accepts_terms_and_conditions', true);
File Uploads:
$request->withFile('profile_picture', UploadedFile::fake()->image('avatar.png'));
withFile() for UploadedFile instances.Assertions:
$request->assertValid(); // Validates the request
$request->assertInvalid(); // Fails validation
$request->assertSessionHasErrors(['field' => 'message']); // Custom error checks
Pest/PHPUnit Agnostic: Works seamlessly in both testing frameworks.
Mocking Dependencies:
$request = RequestFactory::create(StoreUserRequest::class)
->withMock(UserRepository::class, $mockUserRepo);
Dynamic Routes:
$request = RequestFactory::create(UpdateUserRequest::class)
->withRouteParams(['user' => $user->id]);
Reusable Factories:
$factory = RequestFactory::create(StoreUserRequest::class)
->withDefaults(['company' => 'Worksome']);
$factory->with('email', 'new@example.com');
withDefaults() for common test setups.Missing Default Values:
FormRequest relies on merge() or mergeWith() in its constructor, these won’t carry over to the factory.RequestFactory class.Route Binding Conflicts:
UpdateUserRequest with user param), ensure withRouteParams() is used.$request->withRouteParams(['user' => $user]);
Validation Rule Overrides:
assertValid() or assertInvalid() to test rule-specific behavior.File Upload Handling:
withFile() requires a UploadedFile instance. Using raw strings (e.g., 'path/to/file') won’t work.use Illuminate\Http\UploadedFile;
$request->withFile('avatar', UploadedFile::fake()->image('test.png'));
Inspect Raw Input:
dd($request->toArray());
Validation Errors:
assertSessionHasErrors() to debug failed validations:
$request->assertInvalid();
$this->assertSessionHasErrors(['email' => 'required']);
Custom Factories:
Worksome\RequestFactories\RequestFactory to add domain-specific methods:
class UserRequestFactory extends RequestFactory
{
public function withValidUserData(): static
{
return $this
->with('email', 'test@example.com')
->with('password', 'password');
}
}
Custom Factory Classes:
config/request-factories.php:
'factories' => [
App\Http\Requests\StoreUserRequest::class => App\Factories\UserRequestFactory::class,
],
Middleware Simulation:
$request = RequestFactory::create(StoreUserRequest::class);
$request->prepareForValidation($this->app->make('router')->getCurrentRoute()->gatherMiddleware());
Testing Authenticated Requests:
actingAs() helper alongside the factory:
$this->actingAs($user)
->post('/users', RequestFactory::create(StoreUserRequest::class)->toArray());
How can I help you explore Laravel packages today?