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 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~