Как утверждать данные в представлении рециркулятора, которое настроено с макетом вкладки с помощью Expresso в инструментальном тесте Android - PullRequest
0 голосов
/ 23 октября 2019

Я разрабатываю проект Android с использованием Kotlin. Я пишу инструментальные тесты для функциональности приложения. Теперь у меня проблема с написанием инструментированных тестов для следующего пользовательского интерфейса.

enter image description here

Как видите, я использую раскладку вкладок. Под каждой вкладкой находится фрагмент, который имеет вид рециркулятора в каждой (тот же класс фрагмента).

Это сценарий, который я пытаюсь проверить.

Если вкладкавыбрано, я должен убедиться, что нужные данные загружены в соответствующее представление рециркулятора.

Проблема заключается в том, что, поскольку я использую один и тот же фрагмент для каждого фрагмента в каждой вкладке, я не могу захватить рециклерпредставление с использованием идентификатора, потому что было бы три представления переработчика с одинаковыми идентификаторами.

Это фрагментное представление xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:layout_height="match_parent">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/event_list_rc_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Это xml для каждой ячейки в представлении переработчика

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/cell_event_tv_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Это макет XML для основного действия

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/event_list_view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/event_list_tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </androidx.viewpager.widget.ViewPager>
</LinearLayout>

Так я настраиваю TabLayout и ViewPager в упражнении

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_event_list)
        event_list_view_pager.adapter = EventListPagerAdapter(fragmentManager = supportFragmentManager)
        event_list_tab_layout.setupWithViewPager(event_list_view_pager)
    }

Это представлениекласс пейджера для вкладок

class EventListPagerAdapter (fragmentManager: FragmentManager): FragmentPagerAdapter(fragmentManager) {
    override fun getItem(position: Int): Fragment {
        var fragment = EventListFragment()
        var bundle = Bundle()
        when (position) {
            0 -> bundle.putInt(EventListFragment.KEY_TYPE, ApplicationController.EVENT_TYPE_CURRENT)

            1 -> bundle.putInt(EventListFragment.KEY_TYPE, ApplicationController.EVENT_TYPE_FUTURE)

            else -> bundle.putInt(EventListFragment.KEY_TYPE, ApplicationController.EVENT_TYPE_PAST)
        }
        fragment.arguments = bundle

        return fragment
    }

    override fun getCount(): Int {
        return 3
    }

    override fun getPageTitle(position: Int): CharSequence? {
        when (position) {
            0 -> return ApplicationController.instance.getString(R.string.event_list_tab_current)
            1 -> return ApplicationController.instance.getString(R.string.event_list_tab_future)
        }

        return ApplicationController.instance.getString(R.string.event_list_tab_past)
    }
}

Это тестовый класс, который я пытаюсь завершить

@RunWith(AndroidJUnit4::class)
class EventListTest {
    @Rule @JvmField
    val eventListActivityRule: ActivityTestRule<EventListActivity> = ActivityTestRule<EventListActivity>(EventListActivity::class.java)

    @Before
    fun setUp() {

    }

    @Test
    fun eventListIndexZeroTabRendersCurrentEvents() {
         onView(withId(R.id.event_list_tab_layout)).perform(selectTabAtPosition(0))
        //here: how can I test if the recycler view for the tab at index zero is loaded with the right data?
    }

    //reference: https://stackoverflow.com/questions/49626315/how-to-select-a-specific-tab-position-in-tab-layout-using-espresso-testing?fbclid=IwAR2rvx1WW2EAaSJuM4hlNPttPxddD0CATA76Ft1RSAnsGtbMa_fU9m7ZQ4k
    fun selectTabAtPosition(tabIndex: Int): ViewAction {
        return object: ViewAction {
            override fun getDescription(): String {
                return "with tab at index $tabIndex"
            }

            override fun getConstraints(): Matcher<View> {
                return allOf(isDisplayed(), isAssignableFrom(TabLayout::class.java))
            }

            override fun perform(uiController: UiController?, view: View?) {
                val tabLayout = view as TabLayout
                val tabAtIndex: TabLayout.Tab = tabLayout.getTabAt(tabIndex)
                    ?: throw PerformException.Builder().withCause(Throwable("No tab at index $tabIndex")).build()

                tabAtIndex.select()
            }
        }
    }
}

Пожалуйста, обратите внимание на комментарий. Как я могу завершить свой тест, чтобы утверждать, что представление переработчика на вкладке с нулевым индексом загружено с правильными данными?

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