7.个人练习

未匹配的标注

本系列文章为laracasts.com 的系列视频教程——Testing Laravel 的学习笔记。若喜欢该系列视频,可去该网站订阅后下载该系列视频,支持正版

本节说明

  • 对应第 7 小节:Homework Solutions

本节内容

上一节我们预留了两个个人练习,本节我们来完成它们。第一个预留的个人练习是单个删除组员,首先我们新建测试:

tests\Unit\TeamTest.php

    .
    .
    /** @test */
    public function a_team_can_remove_members()
    {
        $team = factory('App\Team')->create();

        $users = factory('App\User',2)->create();

        $team->add($users);

        $team->remove($users[0]);

        $this->assertEquals(1,$team->count());
    }

    /** @test */
    public function a_team_has_a_maximum_size()
    .
    .

运行测试:
file
OK,添加remove方法:

app\Team.php

    .
    .
    public function add($user)
    {
        .
        .
    }

    public function remove(User $user)
    {
        $user->update(['team_id' => null]);
    }
    .
    .

别忘了我们还要设置team_id字段可更新:

app\User.php

    .
    .
    protected $fillable = [
        'name', 'email', 'password','team_id'
    ];
    .
    .

运行测试:
file
上面的这种设计当然是没问题的,但是如果我们想做到如果该用户被移出某个组时我们通知到用户之类的事情,更好的做法是将该逻辑抽取到User.php模型文件中:

app\User.php

    .
    .
    public function leaveTeam()
    {
        $this->team_id = null;
        $this->save();

        return $this;
    }
}

然后调用:

.
.
public function remove(User $user)
{
    $user->leaveTeam();
}
.
.

再次测试:
file

接下来是第二个练习:清空成员。新建测试:

tests\Unit\TeamTest.php

    .
    .
    /** @test */
    public function a_team_can_remove_members()
    {
        $team = factory('App\Team')->create();

        $users = factory('App\User',2)->create();

        $team->add($users);

        $team->remove($users[0]);

        $this->assertEquals(1,$team->count());
    }

    /** @test */
    public function a_team_can_remove_all_members_at_once()
    {
        $team = factory('App\Team')->create();

        $users = factory('App\User',2)->create();

        $team->add($users);

        $team->restart($users);

        $this->assertEquals(0,$team->count());
    }.
    .

我们添加restart方法:

app\Team.php

.
.
public function remove(User $user)
{
    $user->leaveTeam();
}

public function restart()
{
    $this->members()->update(['team_id' => null]);
}
.
.

运行测试:
file

我们在做的练习的基础上增加一个测试:删除组中的部分成员。新建测试:

tests\Unit\TeamTest.php

    .
    .
    /** @test */
    public function a_team_can_remove_members()
    {
        $team = factory('App\Team')->create();

        $users = factory('App\User',2)->create();

        $team->add($users);

        $team->remove($users[0]);

        $this->assertEquals(1,$team->count());
    }

    /** @test */
    public function a_team_can_remove_more_than_one_members_at_once()
    {
        $team = factory('App\Team')->create(['size' => 3]);

        $users = factory('App\User',3)->create();

        $team->add($users);

        $team->remove($users->slice(0,2));

        $this->assertEquals(1,$team->count());
    }
    .
    .

运行测试:
file
看上去我们需要修改remove方法:

app\Team.php

    .
    .
    public function add($user)
    {
        $this->guardAgainstTooManyMembers();

        $method = $user instanceof User ? 'save' : 'saveMany';

        $this->members()->$method($user);
    }

    public function remove($users)
    {
        if($users instanceof User){
            return $users->leaveTeam();
        }

        return $this->removeMany($users);
    }

    public function removeMany($users)
    {
        return $this->members()
            ->whereIn('id',$users->pluck('id'))
            ->update(['team_id' => null]);
    }
    .
    .

再次测试:
file

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~