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);
}
}
}
Начиная с первого, это создает фиксированный файл данных. Макет (вводит в заблуждение) только жив во время функции фикстуры, потому что он использует return
.
Чтобы примерно сказать, что происходит для этого:
второй по поведению идентичен первому, за исключением того, что он использует форму менеджера контекста [111 ] вместо декоратора. лично мне не нравится форма декоратора, но это только я: D
(сначала, прежде чем я продолжу, pytest.yield_fixture
является устаревшим псевдонимом для pytest.fixture
- - вы можете просто использовать @pytest.fixture
)
Третий делает что-то другое! Патч жив на протяжении всего теста, потому что он «уступил» во время фиксации. Это своего рода способ создать установку + демонтаж все в одном. Вот пример выполнения:
next(...)
для него yield
, а затем «делает паузу» , Вы можете думать об этом как о совместной подпрограмме __enter__
из mock
, делающей патч активным yield
ed используется как значение прибора next(...)
на генераторе для исчерпания прибора __exit__
это оператор with, отменяющий патч лучший ответ - , это зависит . Поскольку 1 и 2 функционально эквивалентны, это зависит от личных предпочтений. Выберите 3. Если вам нужно, чтобы патч был активным на протяжении всего теста. И не используйте pytest.yield_fixture
, просто используйте pytest.fixture
.