Тестирование функции черты с отношением Eloquent с использованием анонимных классов - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь проверить черту, которая используется в нескольких моделях 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 как pivot_contactable_test.php0x10c63a39e_ id, `contactable 'в строке 1

Мой вопрос был бы, этоЕсть ли способ сделать эту работу в текущей настройке?Или я должен подойти к этому тесту по-другому?например.тестирование реальной модели, которая использует черту?Хотя неохотно делать это, так как, если я уберу черту из этой модели, тесты не пройдут.Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Это потому, что запросы, выполняемые Laravel, основаны на имени класса (classnametolower_id) для получения внешнего ключа, но вы также можете указать имя таблицы, и я думаю, что это решит вашу проблему:

new class extends Model {
        use Contactable;

        protected $table = 'yourtable';

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