Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message
Deep Closure Comparator

Deep Closure Comparator Laravel Package

eliashaeussler/deep-closure-comparator

PHPUnit comparator/assertion that deeply compares closures inside objects/arrays by serializing them via opis/closure. Use DeepClosureAssert::assertEquals() as a drop-in replacement for PHPUnit’s assertEquals when closures should be treated as equal.

View on GitHub
Deep Wiki
Context7

🪱 Provides a PHPUnit comparator to assert equality of closures

Frequently asked questions about Deep Closure Comparator
How do I install this package for Laravel projects?
Run `composer require --dev eliashaeussler/deep-closure-comparator` in your Laravel project. Ensure PHPUnit ^10.0 and PHP 8.1+ are installed, as the package requires these dependencies. Laravel 10+ projects will work out-of-the-box, but older versions may need manual PHPUnit upgrades.
Can I use this package with PestPHP instead of PHPUnit?
No, this package is designed for PHPUnit only. PestPHP users would need to wrap the `DeepClosureAssert::assertEquals()` method in a custom helper function or use PHPUnit’s native assertions with custom serialization logic.
Will this package work with Laravel’s service container closures (e.g., `$this->app->make()`) or Eloquent models?
Potentially not reliably. Closures binding Laravel’s service container or Eloquent models may fail to serialize consistently, leading to false positives or negatives. Test with your specific use case first, as dynamic scope (e.g., `$this` or `$request`) can cause serialization inconsistencies.
What Laravel versions does this package support?
The package itself doesn’t enforce Laravel version constraints, but it requires PHPUnit ^10.0 and PHP 8.1+. Laravel 10+ projects will work seamlessly, while Laravel 9.x may need PHPUnit downgraded or custom assertions. Test compatibility early in your project.
Is there a performance impact when using deep closure comparisons in large test suites?
Yes, deep serialization of closures adds overhead. For test suites with 1000+ assertions, consider isolating usage to critical cases (e.g., middleware validation) or benchmark alternatives like PHPUnit’s `same()` with custom serialization. Memory/CPU impact depends on closure complexity.
What alternatives exist for testing closures in Laravel without external dependencies?
Laravel’s native `expect($closure)->toReturn()` or PHPUnit’s `same()` with manual serialization (e.g., `serialize($closure)`) are lightweight alternatives. Mockery also supports closure mocking, though it may not handle deep comparisons. Evaluate trade-offs based on your testing needs.
How do I handle closures with dynamic scope (e.g., `$this`, `$request`) in Laravel?
This package may fail for closures with dynamic scope due to inconsistent serialization. If you encounter issues, implement a fallback strategy: extract closure logic into standalone functions or use PHPUnit’s `same()` with custom serialization logic tailored to your Laravel context.
Is this package actively maintained? Should I use it for production Laravel apps?
The package is **abandoned** and no longer necessary due to updates in `sebastian/comparator`. The maintainer explicitly advises switching to `sebastian/comparator` (versions 7.1.8, 8.2.1+) for closure testing. Avoid using this package in new projects.
Can I use this for testing Livewire or Inertia closures tied to frontend state (e.g., Alpine.js)?
No, this package is not suitable for frontend-bound closures. Serialization will fail or produce inconsistent results for closures referencing dynamic frontend state (e.g., Alpine.js reactivity). Stick to unit-testing backend logic with deterministic closures.
How do I migrate from this package to `sebastian/comparator` if I’m already using it?
Replace `DeepClosureAssert::assertEquals()` with PHPUnit’s native `assertEquals()` in your test files. The updated `sebastian/comparator` (7.1.8+) now handles closure comparisons natively, so no additional setup is required. Run tests to validate compatibility.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
codraw/framework-extra-bundle
codraw/messenger
codraw/security
codraw/mailer
codraw/contracts
codraw/profiling
codraw/dependency-injection
codraw/tester
codraw/core
nexmo/api-specification
capell-app/block-library
axium/identity
cetria/laravel-dummy-models
cetria/reflection-helper
agropredict/sso-auth-bundle
evolvestudio/spam-protection
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony