我正在尝试测试在我的应用程序中一些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'
我的问题是,有没有办法让我在当前设置下完成这项工作?还是应该以其他方式进行此测试?例如。测试使用该特征的真实模型?尽管不愿意这样做,因为如果我从该模型中删除特征,则测试将失败。任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
这是因为Laravel进行的查询基于类名(classnametolower_id)来获取外键,但是您也可以提供表名,我认为这可以解决您的问题:
new class extends Model {
use Contactable;
protected $table = 'yourtable';
public function emails()
{
return $this->belongsToMany('App\Email')->withPivot('default');
}
};