Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
405 views
in Technique[技术] by (71.8m points)

phpunit - Laravel 8 factory state from a unit test data provider? (porting from Laravel 7)

In Laravel 7 we pretty routinely use the pattern:

public function provideCanDoThing(): array
{
    return [
        "Root can do thing" => [['root'], true],
        "Normal user cannot do thing" => [[], false],
        "Root cannot do thing while suspended" => [['root', 'suspended'], false],
    ];
}

/**
  * @dataProvider provideCanDoThing
  */
public function testCanDoThing(array $userStates, bool $expectedCanDo): void
{
    $user = factory(User::class)->states($userStates)->create();
    self::expectSame($expectedCanDo, $user->canDoThing());
}

The state "root" can be pretty complicated, with a combo of attributes and afterCreating logic.

In new Laravel 8 factories, the state method no longer runs the collected changes in a named state, instead it... works just like passing attributes to make or create?

I can see how I could rewrite the test more like

$userFactory = User::factory();
foreach($userStates as $userState){
    $userFactory = $userFactory->{$userState}();
}
$user = $userFactory->create();

But that seems much less expressive. I guess I'm surprised I can't find a method on Factory that does that for me.

question from:https://stackoverflow.com/questions/65851381/laravel-8-factory-state-from-a-unit-test-data-provider-porting-from-laravel-7

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...