# Gen Test

> Fully qualified class name of the rule to test (e.g. mglaman\PHPStanDrupal\Rules\Drupal\EntityQuery\EntityQueryHasAccessCheckRule) Use when this capability is needed.

- Skill: `tomevault-io/gen-test-2` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/gen-test-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/gen-test-2/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/gen-test-2

---


# Generate PHPStan Rule Test

Create a test class and fixture file for a PHPStan rule in this project.

## Steps

1. Read the rule class source to understand what it checks
2. Determine the appropriate test directory based on the rule's namespace:
   - `Rules\Classes\` -> `tests/src/Rules/`
   - `Rules\Deprecations\` -> `tests/src/Rules/`
   - `Rules\Drupal\` -> `tests/src/Rules/`
   - `Rules\Drush\` -> `tests/src/Rules/`
   - `Type\` -> `tests/src/Type/`
3. Create the test class following these conventions:
   - Extend `mglaman\PHPStanDrupal\Tests\DrupalRuleTestCase`
   - Use `declare(strict_types=1)` at the top
   - Mark the class as `final`
   - Implement `getRule()` returning an instance of the rule
   - Use `@dataProvider cases` with a generator
   - Each case yields `[files, errors]` where errors are `[message, line, tip?]`
4. Create fixture PHP file(s) in `tests/src/Rules/data/` or `tests/src/Type/data/`
5. Run the test with `php vendor/bin/phpunit --filter=TheNewTestClass` to verify

## Example test structure

```php
<?php

declare(strict_types=1);

namespace mglaman\PHPStanDrupal\Tests\Rules;

use mglaman\PHPStanDrupal\Rules\Drupal\ExampleRule;
use mglaman\PHPStanDrupal\Tests\DrupalRuleTestCase;

final class ExampleRuleTest extends DrupalRuleTestCase
{
    protected function getRule(): \PHPStan\Rules\Rule
    {
        return new ExampleRule();
    }

    /**
     * @dataProvider cases
     *
     * @param list<array{0: string, 1: int, 2?: string|null}> $errors
     */
    public function test(array $files, array $errors): void
    {
        $this->analyse($files, $errors);
    }

    public static function cases(): \Generator
    {
        yield 'passing case' => [
            [__DIR__ . '/data/example-pass.php'],
            [],
        ];
        yield 'failing case' => [
            [__DIR__ . '/data/example-fail.php'],
            [
                ['Error message here.', 10],
            ],
        ];
    }
}
```

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/mglaman) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-11 -->

