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 in a Laravel project?
Run `composer require eliashaeussler/deep-closure-comparator --dev` in your project root. Ensure your Laravel project uses PHPUnit 9.x or 10.x, as the package requires a compatible version. No additional Laravel-specific setup is needed beyond standard PHPUnit assertions.
Can this package compare closures with bound variables like `$this` or `$request` in Laravel?
Yes, the package inspects closure internals, including bound variables like `$this` or service container references. However, test edge cases where closures reference dynamic Laravel objects (e.g., Eloquent models or request data) to ensure accurate comparisons.
What Laravel versions and PHPUnit compatibility does this package support?
The package works with Laravel 9/10 and PHP 8.1+. It requires PHPUnit 9.x or 10.x. If your Laravel project uses an older PHPUnit version, you may need to update it or downgrade the package to a compatible version (check the GitHub releases).
How does this differ from Laravel’s native `expect($closure)->toReturn()`?
Laravel’s native assertions only verify closure output, while this package performs *deep comparison*—inspecting code structure, bound variables, and scope. Use this for testing caching, memoization, or duplicate callback logic where surface-level checks are insufficient.
Will this package slow down my test suite significantly?
Deep closure comparisons add overhead, especially for large test suites. Benchmark performance in your environment. For most cases, the impact is minimal unless comparing thousands of closures. Consider caching results if used in CI pipelines.
Does this work with PestPHP instead of PHPUnit?
No, this package is PHPUnit-specific. PestPHP uses a different assertion syntax, so you’d need to wrap the assertions or stick with PHPUnit. If using Pest, evaluate whether native assertions or Mockery suffice for your use case.
How do I handle closures that reference database queries or Eloquent models?
The package compares closures at the code level, including bound variables. However, if closures reference dynamic database states (e.g., `Model::find()`), comparisons may fail due to non-deterministic results. Mock dependencies or use static data for reliable tests.
Are there alternatives if I only need basic closure testing?
For simple cases, Laravel’s native `expect($closure)->toReturn()` or Mockery’s `shouldReceive()` are sufficient. This package is only necessary for deep introspection—like comparing nested closures, variable capture, or closure equality in caching systems.
How do I test closures in Laravel’s RefreshDatabase tests?
The package works with RefreshDatabase, but ensure your closures don’t depend on transient database states. If testing seeded data, reset the database between assertions or use deterministic closures. The package itself doesn’t interact with Laravel’s testing traits.
What should I do if comparisons fail for closures with static calls or late binding?
Static calls or late-binding closures (e.g., `static::method()`) may not compare as expected due to runtime resolution. Test these edge cases explicitly. If needed, pre-process closures or use simpler alternatives for assertions. Check the GitHub issues for known limitations.
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.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport