2017-07-18 1 views
1

Ich versuche, Tests für das PreferenceFragments-Fragment in den Einstellungen zu schreiben.Testen von Android PreferenceFragment mit Espresso

Allerdings habe ich diesen Fehler wurde immer: android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: is assignable from class: class android.widget.AdapterView

Der Code für den Test ist die folgende:

@RunWith(AndroidJUnit4.class) 
@SmallTest 
public class SettingsFragmentTest { 

    @Rule 
    public ActivityTestRule<SettingsActivity> mActivityRule = new ActivityTestRule<>(
      SettingsActivity.class); 

    @Test 
    public void preferredLocationShouldBeVisibleOnDisplay(){ 
     mActivityRule.getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       SettingsFragment settingsFragment = startSettingsFragment(); 
      } 
     }); 

     // This check passes correctly 
     onView(withId(R.id.weather_settings_fragment)) 
       .check(matches(isCompletelyDisplayed())); 

     // This check gives me the NoMatchingViewException 
     onData(allOf(is(instanceOf(Preference.class)), 
       withKey("location"))) 
       .check(matches(isCompletelyDisplayed())); 
    } 

    private SettingsFragment startSettingsFragment(){ 
     SettingsActivity activity = mActivityRule.getActivity(); 
     FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 
     SettingsFragment settingsFragment = new SettingsFragment(); 

     transaction.replace(R.id.weather_settings_fragment, settingsFragment, "settingsFragment"); 
     transaction.commit(); 

     return settingsFragment; 
    } 
} 

Die settings_activity Layout sieht wie folgt aus:

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
      android:name="com.example.android.sunshine.SettingsFragment" 
      android:id="@+id/weather_settings_fragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

Das Bildschirmlayout für die Einstellungen lautet wie folgt:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 

    <EditTextPreference 
     android:defaultValue="@string/pref_location_default" 
     android:inputType="text" 
     android:key="@string/pref_location_key" 
     android:singleLine="true" 
     android:title="@string/pref_location_label" /> 

    <ListPreference 
     android:defaultValue="@string/pref_units_metric" 
     android:entries="@array/pref_units_options" 
     android:entryValues="@array/pref_units_values" 
     android:key="@string/pref_units_key" 
    android:title="@string/pref_units_label" /> 

<CheckBoxPreference 
    android:defaultValue="@bool/show_notifications_by_default" 
    android:key="@string/pref_enable_notifications_key" 
    android:summaryOff="@string/pref_enable_notifications_false" 
    android:summaryOn="@string/pref_enable_notifications_true" 
    android:title="@string/pref_enable_notifications_label" /> 

</PreferenceScreen> 

Ich konnte online keine Beispiele oder Informationen zum Testen von PreferenceFragments finden. Die meisten Informationen beziehen sich auf Testaktivitäten.

Antwort

0

Normalerweise teste ich Fragmente durch ihre Aktivität mit Espresso. Testen Sie einfach die von Ihrem Fragment angezeigte Benutzeroberfläche so, als ob sie in der Aktivität enthalten wäre, die Sie mit ActivityTestRule starten. Wenn das Fragment beim ersten Start der Aktivität nicht vorhanden ist, navigieren Sie in Ihrem Test genauso wie ein Benutzer, um die Fragmenttransaktion zu starten. Wenn Sie die Geschäftslogik testen müssen, bei der Sie Fragmente in einer Art Testumgebung aufstellen müssen, ist das normalerweise ein guter Hinweis darauf, dass Sie in eine separate Klasse ausgegliedert werden sollten, die (idealerweise) ohne Android getestet werden kann Abhängigkeiten.

Verwandte Themen