【问题标题】:Unit testing model relationships in LaravelLaravel 中的单元测试模型关系
【发布时间】:2019-12-11 16:30:53
【问题描述】:

在我的应用中,用户和组织之间存在多对多关系,

用户

public function organisations()
{
    return $this->belongsToMany('App\Organisation')->withPivot(['owner']);
}

组织

public function users()
{
    return $this->belongsToMany('App\User')->withPivot(['owner']);
}

此关系上有一个数据透视列,用于说明用户是否是组织的所有者。

我正在努力测试这种关系,但我的测试返回了,

断言 null 匹配预期 1 失败。 预期:1 实际:null

这是我的测试功能,

public function testUserHasOwnershipOfOrganisations()
{
    $userRow = factory(User::class)->create();
    $organisation = factory(Organisation::class)->create();
    $userRow->organisations()->attach($organisation->id, ['owner' => true]);
    $user = User::first();
    $ownOrganisations = $user->organisations()->wherePivot('owner', true);
    $this->assertEquals($organisation->id, $ownOrganisations->first()->organisation_id);
}

上面的思维过程是做一个用户,做一个组织,建立关系。查询表中的第一个用户,获取他们的组织,并确保组织关系中的组织与我刚刚创建的ID相同。

谁能告诉我为什么这不能像我预期的那样工作?

谢谢

【问题讨论】:

    标签: php laravel unit-testing phpunit eloquent-relationship


    【解决方案1】:

    更新:

    也检查一下:

    $ownOrganisations->first()->organisation_id
    

    应该是这样的:

    $ownOrganisations->first()->id
    

    /结束更新

    我能看到的唯一问题是这行代码:

    $user = User::first();
    

    这取决于您的测试环境是如何配置的,但不能保证您新创建的用户是表中的第一个。我建议做一些更明确的事情:

    $user = User::find($userRow->id);
    

    还要仔细检查您的工厂,以确保他们不会自行将模型添加到这种关系中。如果是这样,您需要在检索模型时将其考虑在内。

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 2015-06-25
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2019-05-14
      • 2019-02-23
      • 1970-01-01
      相关资源
      最近更新 更多