2010-06-21 42 views
12

Tôi cần phải trang trải chức năng Menu theo các bài kiểm tra đơn vị, tuy nhiên tôi đang cố gắng để có được đối tượng Menu.Làm thế nào để kiểm tra Menu

Tiếp theo trường hợp thử nghiệm thất bại (mMenu là null):

sendKeys(KeyEvent.KEYCODE_MENU); 
mMenu = (Menu) mActivity.findViewById(com.###.###.R.id.main_menu); 
assertNotNull(mMenu); 

lời khuyên hãy. Cảm ơn bạn.

Trả lời

22

Tôi chạy vào kịch bản này tương tự và đã đưa ra như sau (rất đơn giản) giải pháp trong việc thực hiện của tôi về ActivityInstrumentationTestCase:

... 
ActivityMonitor am = getInstrumentation().addMonitor(LoginActivity.class.getName(), null, false); 

// Click the menu option 
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); 
getInstrumentation().invokeMenuActionSync(mActivity, R.id.logout, 0); 

Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000); 
assertEquals(true, getInstrumentation().checkMonitorHit(am, 1)); 
a.finish(); 
... 

Đoạn mã này làm ba điều:

  1. Clicks sự tùy chọn menu,
  2. Đảm bảo chúng tôi chuyển đến hoạt động thích hợp sau khi nhấp vào tùy chọn trình đơn và
  3. hoàn thành hoạt động đã được bắt đầu (rất quan trọng cho các bài kiểm tra sau này).

Tôi hy vọng điều này sẽ hữu ích.

+0

Đây là một câu trả lời hữu ích và đoạn mã, quan trọng nhất là nó làm nổi bật rằng bạn phải gửi 'KeyEvent.KEYCODE_MENU' trước khi gọi hành động menu. Trong nhận thức rõ ràng, tôi đoán là bạn phải có menu hiển thị trước khi bạn có thể gọi một mục đó. –

+1

FWIW Tôi sử dụng getInstrumentation(). InvokeMenuActionSync() mà không cần gọi trước sendKeyDownUpSync() và nó cũng hoạt động tốt. Xem câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/5209154/test-menu-items – karni

+0

Tôi quan sát thấy rằng lệnh gọi sendKeyDownUpSync là cần thiết, nếu bạn muốn kiểm tra nếu trong điều kiện là kết quả của công việc được thực hiện trong onPrepareOptionMenu, invokeMenuActionSync trả về true.Nếu không có cuộc gọi, onPrepareOptionsMenu đã không được gọi. – mtotschnig

2

Chính xác thì bạn đang thử nghiệm gì? Các mục menu đó thực hiện hành động đúng không?

Bạn có thể gọi Activity.openOptionsMenu() để mở menu và tham khảo menu bằng cách ghi đè một trong các phương pháp onMenu. Tại thời điểm đó, bạn có thể sử dụng Menu.performIdentifierAction để chọn các mục menu.

+1

Có, tôi cần kiểm tra xem tất cả các menu và menu phụ có đang thực hiện các hành động chính xác không. sendKeys (KeyEvent.KEYCODE_MENU) hoạt động chính xác và tôi có thể thấy Menu trên trình mô phỏng (Tôi không thể nhìn thấy nó nếu tôi gọi Activity.openOptionsMenu()). Bạn có nghĩa là tôi cần ghi đè lênMenuOpened trong ứng dụng đích và lưu tham chiếu Menu bên trong hoạt động? Có thể có cách nào để không chạm vào ứng dụng đích? – cement

2

Nếu bạn muốn thực hiện kiểm tra giao diện người dùng, hệ thống hoặc chức năng, tôi khuyên bạn nên sử dụng Robotium. Sau đó, bạn chỉ có thể sử dụng sendKey (Solo.MENU) và sau đó nhấp vào các mục trình đơn bằng cách sử dụng clickOnText() hoặc clickOnView(). Khi bạn đã làm điều đó bạn có thể khẳng định hành vi đúng đắn. Chỉ cần khẳng định rằng nó không phải là null là không đủ. Bạn nên kiểm tra Robotium, cách của nó thích hợp hơn khi sử dụng khi kiểm tra những thứ như thế này.

+0

+1. Chỉ mới bắt đầu sử dụng nó. Trông rất tiện dụng. – alehro

1
Activity act =launchActivity(intent); 

    MenuBuilder builder=new MenuBuilder(mInst.getTargetContext()); 

    act.onCreateOptionsMenu(builder); 



    act.onPrepareOptionsMenu(builder); 

    Log.i(TAG, "BuilderSize: "+builder.size()); 
    int visible=0; 
    for(int i=0;i<builder.size();i++) 
    { 
     MenuItem item=builder.getItem(i); 

     if(item.isVisible()&& item.isEnabled()) 
     { 
      Log.i(TAG, item.getTitle().toString()); 
      visible++; 
     } 
    } 
    act.finish(); 
+0

MenuBuilder không thể được giải quyết thành một loại! –

0

Sử dụng thiết bị đo lường để kiểm tra cách nhấn của mục menu cho bạn.

Đây là trường hợp thử nghiệm mẫu của tôi gọi trình đơn "Cài đặt", bắt đầu hoạt động khác.

public void testCanGoToSettings() { 
    final MainActivity activity = getActivity(); 

    Instrumentation.ActivityMonitor am = getInstrumentation().addMonitor(ConfigureActivity.class.getName(), 
      null /* result */, true /* block */); 

    getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); 
    getInstrumentation().invokeMenuActionSync(activity, R.id.menu_settings, 0 /* flags */); 

      /* if not block in addMonitor() above, then comment out this... 
    Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000); 
    a.finish(); 
      */ 

} 
Các vấn đề liên quan