使用匿名类测试具有雄辩关系的特征函数

时间:2019-01-31 14:02:04

标签: php laravel eloquent phpunit php-7

我正在尝试测试在我的应用程序中一些Eloquent模型中使用的特征。我采用的测试方法是在测试类中创建一个匿名类,并测试在匿名类上调用的trait方法是否返回正确的结果。由于在trait方法中调用关系而使我陷入困境,匿名类方法似乎正在用这种方法挣扎。

我在测试类中创建了一个匿名类,该类扩展了Eloquent模型并使用了我要测试的特征。我还指定了anon类中的关系,然后将该类用于我要测试的trait方法中。但是,由于该关系是多对多的,因此当我尝试在测试中调用该关系时,Eloquent正在查找一个联接表ai2nx3xla_emails(ai2nx3xla是anon类的隐藏名称),该联接表当然不在我的数据库中

测试课程的相关部分

public function setUp()
{
    parent::setUp();

    $this->testClass = new class extends Model {
        use Contactable;

        public function emails()
        {
            return $this->belongsToMany('App\Email')->withPivot('default');
        }
    };
}

/** @test */
public function it_can_return_the_default_email_for_a_model()
{
    $email = factory(\App\Email::class)->make();
    $this->testClass->setRelation('emails', $email);
    $this->assertEquals($email->id, $this->testClass->defaultEmail());
}

特征的相关部分(为简单起见而简化)

abstract public function emails();

/**
 * Return the default email if exists
 *
 */
public function email()
{
    $email = $this->emails()->wherePivot('default', true)->first() ?? $this->emails()->first();
    return $email;
}

我希望测试能够通过,但实际上收到了以下错误消息:

  

PDOException:SQLSTATE [42000]:语法错误或访问冲突:   1064您的SQL语法错误;请查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在'。php0x10c63a39e_id附近使用{'1}},在第1行使用'contactable'

我的问题是,有没有办法让我在当前设置下完成这项工作?还是应该以其他方式进行此测试?例如。测试使用该特征的真实模型?尽管不愿意这样做,因为如果我从该模型中删除特征,则测试将失败。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为Laravel进行的查询基于类名(classnametolower_id)来获取外键,但是您也可以提供表名,我认为这可以解决您的问题:

new class extends Model {
        use Contactable;

        protected $table = 'yourtable';

        public function emails()
        {
            return $this->belongsToMany('App\Email')->withPivot('default');
        }
    };