
Good content takes time and effort to come up with.
Please consider supporting us by just disabling your AD BLOCKER and reloading this page again.
In my previous article, I had explained why should we use Laravel factories. You can check the article at Factories To Speed Up Test-Driven Development In Laravel.
In this article let's see how we can use Factory states to write fluent test cases.
First, let's see how does our test cases looks like without any factory states.
Basically, we are writing a test to check that the user cannot view any unpublished blog posts.
/**
* @test
*/
public function user_cannot_view_unpublished_post()
{
$post = factory(Post::class)->create([
'published_at' => null
]);
$resource = $this->get("/posts/" . $post->slug);
$resource->assertStatus(404);
}
use App\Post;
use App\User;
use Carbon\Carbon;
use Illuminate\Support\Str;
use Faker\Generator as Faker;
$factory->define(Post::class, function (Faker $faker) {
return [
'title' => 'My first blog',
'slug' => Str::slug('My first blog'),
'summary' => 'First blog summary',
'body' => 'First blog body',
'author_id' => function () {
return factory(User::class)->create()->id;
},
];
});
Basically there is no problem with the above approach. Since we can write more cleaner we can use this approach.
From the above code snippet we can write the code
$post = factory(Post::class)->create([
'published_at' => null
]);
$post = factory(Post::class)->states(['unpublished'])->create();
Now your test case will look like the following very lean, clean & fluent
/**
* @test
*/
public function user_cannot_view_unpublished_post()
{
$post = factory(Post::class)->states(['unpublished'])->create();
$resource = $this->get("/posts/" . $post->slug);
$resource->assertStatus(404);
}
use App\Post;
use App\User;
use Carbon\Carbon;
use Illuminate\Support\Str;
use Faker\Generator as Faker;
$factory->define(Post::class, function (Faker $faker) {
return [
'title' => 'My first blog',
'slug' => Str::slug('My first blog'),
'summary' => 'First blog summary',
'body' => 'First blog body',
'author_id' => function () {
return factory(User::class)->create()->id;
},
];
});
$factory->state(Post::class, 'unpublished', function (Faker $faker) {
return [
'published_at' => null
];
});
/** Similarly you can have published state too */
$factory->state(Post::class, 'published', function (Faker $faker) {
return [
'published_at' => Carbon::parse('-1 week')
];
});
I hope this article helped you. Please share it with your friends.
Manipulate HTML Using DOMDocument In PHP
Generate RSS Feeds in PHP Laravel
Laravel Custom Maintenance Page
Basic Server Security Setup For Ubuntu / Linux
NGINX Security Best Practices & Optimization
Sass or SCSS @function vs @mixin
SummerNote WYSIWYG Text Editor Save Images To Public Path In PHP Laravel
Unable to prepare route [{fallbackPlaceholder}] for serialization. Uses Closure In Laravel
Ensure text remains visible during Webfont load
GitHub Login With PHP Laravel Socialite