2013-10-07 54 views
0

我有一個新創建的android-18應用程序,其中PreferenceScreen太明顯了,&很簡單。ActivityUnitTestCase vs PreferenceScreen

而且我還有一個自動化測試[固定將問題轉換爲答案]。

public class MyPreferenceTest extends ActivityUnitTestCase<MyPreference> { 
    Intent intent; 
    MyPreference activity; 

    public MyPreferenceTest() { 
     super(MyPreference.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     Context targetContext = getInstrumentation().getTargetContext(); 
     intent = new Intent(targetContext, MyPreference.class); 
     super.setUp(); 
    } 

    private void assembleActivity() { 
     startActivity(intent, null, null); 
     activity = getActivity(); 
    } 

    private void assemblePreferences(String device, String userName, String password) { 
     Context targetContext = getInstrumentation().getTargetContext();   
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(targetContext); 
     SharedPreferences.Editor editor = sharedPref.edit(); 

     editor.putString("smart_phin_bluetooth_devices", device); 
     editor.putString("username", userName); 
     editor.putString("password", password); 
     editor.commit(); 
    } 

    public void test_empty_userNames_dont_reflect_into_the_summary() { 
     assemblePreferences("", "", ""); 
     assembleActivity(); 
     activity.onResume(); 
     EditTextPreference userName = (EditTextPreference) activity.findPreference("username"); // FIXME userName 
     assertEquals("", userName.getEditText().getText().toString()); 
     assertEquals("", userName.getText()); 
     assertEquals("Enter your user name", userName.getSummary().toString()); 
    } 

    public void test_full_userNames_reflect_into_the_summary() { 
     assemblePreferences("", "BookerT", ""); 
     assembleActivity(); 

     activity.onResume(); // We must call this bc Android does but the test rig does not... 
     EditTextPreference userName = (EditTextPreference) activity.findPreference("username"); 
     assertEquals("username", userName.getKey()); 

     assertEquals("BookerT", String.valueOf(userName.getText().toString()); 
//  assertEquals("BookerT", userName.getEditText().getText().toString()); 
     assertEquals("BookerT", userName.getSummary().toString()); 
    } 

} // end of class MyPreferenceTest 

註釋斷言會失敗,因爲沒有任何內容調用該EditText視圖。

測試現在檢查onResume()中的新代碼是否更新來自通用語言的摘要以反映首選項的當前值。

+0

哪個斷言「返回」「字符串,就好像首選項是空的」? 'test_full_userNames_reflect_into_the_summary()'中有四個,其中兩個被註釋掉。所以,例如,你是說'userName.getKey()'返回一個空字符串? – CommonsWare

+0

我對'userName.getEditText()。getText()'返回''BookerT'''生根。如果(工作原理)EditText對象尚未填充,因爲它沒有顯示,一般的問題是如何編寫測試,從PreferenceScreen中提取行爲細節 - 最好是_without_在問題中拋出Robotium ... – Phlip

回答

1

你在測試中有一個錯誤。

private void assemblePreferences(String device, String userName, String password) 

注意,值的順序這裏是deviceuserNamepassword

assemblePreferences("BookerT", "", ""); 

因此deviceBookerT,不userName

+0

Ouch。謝謝!但是......修正了第一個斷言(我們現在可能對「assertEquals(」BookerT「,userName.getText()。toString());」)不加理會。我可以從這裏繼續使用我的實際功能,但第二個註釋斷言仍然不能從其評論標記中釋放。 – Phlip

+0

@Phlip:在打開對話框之前,EditText不會被填充。恕我直言,這個測試是毫無意義的,因爲你正在測試你沒寫的'EditTextPreference'的功能。 – CommonsWare

+0

我正在這樣做:http://stackoverflow.com/questions/531427/how-do-i-display-the-current-value-of-an-android-preference-in-the-preference-su。所以測試是一項正在進行中的工作。我們正在討論「彙編」階段,而不是實際的斷言目標。 – Phlip

相關問題