Как я могу переписать это так, чтобы он не нуждался в выражении возврата вне foreach - PullRequest
1 голос
/ 07 февраля 2020

Таким образом, для целей тестирования этот метод, использующий отношения laravel, никогда не достигнет оператора возврата вне foreach l oop. Откуда мне знать? Поскольку fieldName существует в одном из этих полей формы, я просто не знаю, какое из них, следовательно, для l oop.

Рассмотрим следующий метод:

protected function fetchFieldLabel(string $fieldName) {
    foreach ($this->forms as $form) {
        $foundField = $form->fields->where('name', '=', $fieldName)->first();

        if (!is_null($foundField)) {
            return $foundField->label;
        }
    }

    return null;
}

Я должен не нужно return null в конце метода, если я его удалю, мой охват кода не будет 100% для этого метода, поэтому я ищу лучший способ вернуть $foundField->label без a для l oop поскольку покрытие кода всегда будет попадать в этот оператор возврата (в конце концов), и оно никогда не покинет foreach l oop.

Для контекста:

enter image description here

Я смотрел на фильтр , но я не уверен, как использовать его в этом контексте.

Когда я пишу что-то вроде:

    $this->forms->filter(function($form) use($fieldName) {
        return $form->fields->where('name', $fieldName);
    })->first();

Я получаю весь объект формы, все его поля и все их зависимости.

Для справки:

  • Форма имеет много полей, поле принадлежит форме.

Любые мысли о том, как я мог бы написать это так, чтобы я получил 100% покрытие кода и не имел "никогда не достигнуто return null" * 1 036 *

PS: Все, что я хочу, - это найти поле (в коллекции форм), к которому принадлежит $fieldName, и вернуть метку этого поля.

PS2: я не смог бы написать тест, в котором он мог бы вернуть ноль, поскольку в этом случае имя поля будет ВСЕГДА существовать в наборе полей форм. Опять же, мы просто не знаем, на каком он существует.

1 Ответ

1 голос
/ 07 февраля 2020

Простой способ - использовать break вместо возврата.

protected function fetchFieldLabel(string $fieldName) {
    $label = null;

    foreach ($this->forms as $form) {
        $foundField = $form->fields->where('name', '=', $fieldName)->first();

        if (! is_null($foundField)) {
            $label = $foundField->label;
            break;
        }
    }

    return $label;
}

В противном случае вы можете использовать Collection прямо так:

protected function fetchFieldLabel(string $fieldName) {
    return optional($this->forms->map(function ($form) use ($fieldName) {
        return $form->fields->firstWhere('name', $fieldName);
    })->filter()->first())->label;
}

Так что в принципе , вы отображаете форму в поле, которое соответствует $fieldName, которое вернет null, если форма не имеет поля. Затем filter, чтобы удалить тех, кто не проходит проверку на истинность. И затем цепочка first, чтобы получить первое поле. Наконец label, чтобы получить метку поля.

Вы также можете обернуть все в необязательный помощник , чтобы убедиться, что label никогда не выдаст ошибку, если поле не найдено, даже если вы сказали, что этого никогда не произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...