2016-03-16 33 views

Odpowiedz

8

Domyślam się, że naprawdę nie będziecie sprawdzać kodu, a jeśli zachowa się to zgodnie z oczekiwaniami za pomocą tych komponentów.

Ponieważ zakres swoje pytanie jest dość szeroki, pozwól mi dać to przypadków użycia .:

Załóżmy masz fragment z RecyclerView, która ma LinearLayoutManager. Chcesz przetestować, czy kliknięcie jednego z elementów uruchamia właściwe wywołanie metody na innej warstwie. (Powiedzmy użyć MVP i to jest prezenter)

Ewentualna próba mogłaby wyglądać następująco .:

@RunWith(RobolectricGradleTestRunner::class) 
@Config(constants = BuildConfig::class, sdk = intArrayOf(21)) 
class MyFragmentTest { 

lateinit var fragment: MyFragment 
lateinit var activityController: ActivityController<FragmentActivity> 

@Before 
@Throws(Exception::class) 
fun setUp() { 
    fragment = MyFragment() 

    activityController = Robolectric.buildActivity(FragmentActivity::class.java) 

    activityController.create().start().resume() 

    activityController.get() 
      .supportFragmentManager 
      .beginTransaction() 
      .add(fragment, null) 
      .commit() 
} 

@Test 
@Throws(Exception::class) 
fun testClickEntry() { 
    val recycler = fragment.view!!.findViewById(R.id.sideNavigationRecycler) as RecyclerView 
    // workaround robolectric recyclerView issue 
    recycler.measure(0,0) 
    recycler.layout(0,0,100,1000) 

    // lets just imply a certain item at position 0 for simplicity 
    recycler.findViewHolderForAdapterPosition(0).itemView.performClick() 

    // presenter is injected in my case, how this verification happens depends on how you manage your dependencies. 
    verify(fragment.presenter).onEntryClicked(MyNavigationEntry.XYZ) 
} 
} 

żal składni przede wszystkim używam Kotlin w moich testów.

Muszę powiedzieć, że nie jestem w 100% zadowolony z tego sam, ale uważam, że jest to uzasadnione, jeśli nie chcesz przetestować poprawnej komunikacji twoich warstw.

+0

Użyłem '.measure' i' .layout' i nie działa wcześniej, teraz działa dzięki – david

+0

.measure i .layout dozwolone getAdapterPosition do pracy poprawnie dla mnie – Shooky