Каковы функциональные различия в этих 3 приспособлениях?

View s раздуты из макета - как ваш пример TextView - не добавляются к их родительскому ViewGroup с addView(View child), поэтому переопределение этого метода не работает для вас. Вы хотите переопределить addView(View child, int index, ViewGroup.LayoutParams params), в результате чего все остальные addView() перегрузки заканчиваются вызовом.

В этом методе проверьте, является ли добавленный ребенок одним из двух специальных FrameLayout s. Если это так, пусть класс super обрабатывает добавление. В противном случае добавьте дочерний элемент в ваш контейнер FrameLayout.

public class CustomFrameLayout extends FrameLayout {

    private final FrameLayout topLayout;
    private final FrameLayout containerLayout;

    ...

    public CustomFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater.from(context).inflate(R.layout.custom, this, true);
        topLayout = (FrameLayout) findViewById(R.id.frame_layout_top);
        containerLayout = (FrameLayout) findViewById(R.id.frame_layout_child_container);
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        final int id = child.getId();
        if (id == R.id.frame_layout_top || id == R.id.frame_layout_child_container) {
            super.addView(child, index, params);
        }
        else {
            containerLayout.addView(child, index, params);
        }
    }
}
0
задан Stone 18 January 2019 в 16:00
поделиться

1 ответ

fixture 1

Начиная с первого, это создает фиксированный файл данных. Макет (вводит в заблуждение) только жив во время функции фикстуры, потому что он использует return.

Чтобы примерно сказать, что происходит для этого:

  • pytest замечает, что ваш прибор используется для тестовой функции
  • он вызывает функцию прибора
    • макет decorator запускает патч
    • , фиктивный декоратор вызывает вашу фактическую функцию (которая возвращает значение)
    • , фиктивный декоратор отменяет патч
  • pytest замечает его не был генератором, и это значение вашего прибора

приспособление 2

второй по поведению идентичен первому, за исключением того, что он использует форму менеджера контекста [111 ] вместо декоратора. лично мне не нравится форма декоратора, но это только я: D

fixture 3

(сначала, прежде чем я продолжу, pytest.yield_fixture является устаревшим псевдонимом для pytest.fixture - - вы можете просто использовать @pytest.fixture)

Третий делает что-то другое! Патч жив на протяжении всего теста, потому что он «уступил» во время фиксации. Это своего рода способ создать установку + демонтаж все в одном. Вот пример выполнения:

  • Pytest замечает, что ваш прибор используется для тестовой функции
  • Pytest вызывает функцию прибора
    • , так как это генератор, он сразу возвращается без выполнения кода
  • pytest замечает, что он является генератором, вызывает next(...) для него
    • , что приводит к выполнению кода до yield, а затем «делает паузу» , Вы можете думать об этом как о совместной подпрограмме
    • , называемой __enter__ из mock, делающей патч активным
    • , значение, которое yield ed используется как значение прибора
  • pytest затем выполняет вашу тестовую функцию
  • pytest, затем снова вызывает next(...) на генераторе для исчерпания прибора
    • __exit__ это оператор with, отменяющий патч

, какой выбрать?

лучший ответ - , это зависит . Поскольку 1 и 2 функционально эквивалентны, это зависит от личных предпочтений. Выберите 3. Если вам нужно, чтобы патч был активным на протяжении всего теста. И не используйте pytest.yield_fixture, просто используйте pytest.fixture.

0
ответ дан Anthony Sottile 18 January 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: