2010-03-08 25 views
31

Có ai biết cách kiểm tra sự xuất hiện của thông báo Bánh mì nướng trên một Hoạt động không?Cách kiểm tra sự xuất hiện của thông báo Bánh mì nướng

Tôi đang sử dụng mã tương tự như những gì OP được đăng trên this question để kiểm tra luồng chương trình của tôi từ hoạt động này sang hoạt động tiếp theo. Tôi cũng muốn có thể kiểm tra các tin nhắn chúc mừng về các hoạt động cụ thể.

Trả lời

22

Có ai biết cách kiểm tra hiển thị của thông báo Bánh mì nướng trên Hoạt động không?

Bạn không thể - xin lỗi. Theo đó, tôi có nghĩa là không có cách nào để hỏi Android "hey, là một Toast hiển thị? Và nó trông như thế nào?".

+1

Cảm ơn điều đó CommonsWare. Tôi có thể sẽ làm một cái gì đó giống như cư một biến với thông báo bánh mì nướng khi tạo bánh mì nướng. Nó sẽ vô hình cho người dùng nhưng sẽ cho tôi một cái gì đó để kiểm tra. – Adrian

+9

Voilà: myToast.getView(). IsShown(). –

12

Hm, trên thực tế có khả năng kiểm tra giao diện của bánh mì nướng. Chỉ cần tạo một lớp con của Bánh mì nướng (ví dụ: MyOwnToast) và sử dụng lớp này trong chương trình của bạn thay vì Bánh mì nướng. Trong lớp con này, bạn có thể ghi đè lên phương thức show() để thông báo cho bạn biết rằng Toast đang được hiển thị. Ngoài ra, bạn có thể lưu trữ Toast trong phương thức show() dưới dạng một ToastDatabase singleton từ nơi bạn có thể truy cập Toast và xem nó sau khi nó đã được hiển thị và hủy (chưa thử nghiệm với Toasts, nhưng Tôi thường làm điều đó với ý định kết quả của các hoạt động để giữ cho chúng có sẵn để kiểm tra thêm sau khi chúng đã bị phá hủy - vì vậy sẽ không có vấn đề gì khi thực hiện điều này với Toasts).

Hãy coi chừng: có thể bạn phải sao chép đối tượng Bánh mì nướng hoặc chế độ xem tương ứng của nó cho ToastDatabase vì có lẽ nó sẽ là rỗng sau khi Bánh mì nướng đã bị hủy. Hi vọng điêu nay co ich!

+0

Cảm ơn vì lordfinga đó. Âm thanh như một giải pháp neater hơn tôi mô tả. – Adrian

+2

Ý tưởng hay - nhưng hãy cẩn thận khi thêm mã vào mã sản xuất chỉ cho mục đích thử nghiệm. Tôi muốn giới thiệu một phương pháp để vô hiệu hóa "mã thử nghiệm" này trong mã sản xuất cuối cùng, có thể bằng cách kiểm tra cờ gỡ lỗi trong tệp kê khai http://stackoverflow.com/a/4277868/383414 –

6

tôi kiểm tra, các công việc sau:

if(someToast == null) 
    someToast = Toast.makeText(this, "sdfdsf", Toast.LENGTH_LONG); 
boolean isShown = someToast.getView().isShown(); 
+1

Nếu chúng tôi thực sự hỏi "cách có thể ActivityUnitTestCase khẳng định rằng mã sản xuất đã kích hoạt một Toast với các nội dung như vậy ", thì một thử nghiệm như vậy không nên phụ thuộc vào mã sản xuất phụ. Ví dụ: nếu bạn đã mã hóa lại mã đó, bạn sẽ không muốn thử nghiệm bị hỏng, khi sản xuất một Bánh mì nướng thực vẫn hiển thị. – Phlip

2

bạn có thể chọn Robolectric kiểm tra framework.For kiểm tra bánh mì nướng, bạn có thể sử dụng nó như dưới đây:

assertTrue(ShadowToast.showedCustomToast("message", R.id.message)); //R.id.message: textView ID 
-3

Tôi đang sử dụng nó như:

wait_for_text("Notification message to be verified", timeout: 30) 

Đây là cách thay thế phục vụ một phần mục đích.

+0

Wait_for_text() là gì? Không có phương thức nào trong API Android có tên này. –

+0

Nếu bạn đang sử dụng một ngôn ngữ khác ngoài Java bạn nên chỉ định. –

+0

"wait_for_text" là một phương pháp trong Calabash api trong ruby ​​ –

8

Hiện tại, chúng tôi có thể kiểm tra tin nhắn bánh mì nướng bằng cách sử dụng robolectric. Ví dụ dưới đây là cách nhóm chúng tôi đang làm điều này cho bây giờ:

@Test 
    public void ccButtonDisplaysToast() throws NullPointerException { 
     Button ccRedButton = (Button) findViewById(R.id.cc_red); 
     cc_red.performClick(); --> this calls the actual onClickListener implementation which has the toast. 
     ShadowLooper.idleMainLooper(YOUR_TIME_HERE); --> This may help you. 
     assertThat(ShadowToast.getTextOfLatestToast().toString(), equalTo("TEST_YOUR_TEXT_HERE")); 
    } 

Hope this helps

+0

Dường như với tôi rằng giữa thời gian bạn gọi 'performClick()' và làm xác nhận rằng có thể bánh mì nướng chưa xuất hiện và sẽ xuất hiện sau khi xác nhận kết thúc. Làm cách nào để chúng tôi tính đến khả năng này? –

+0

Robolectric có shadowHandler.idleMainLooper đã không được chấp nhận. Tuy nhiên, có một ShadowLooper.idleMainLooper() có nhiều triển khai. Một trong số họ lấy "thời gian" làm thông số để kích hoạt các lệnh thực thi .. – user2511882

2

Bạn có thể kiểm tra xem bánh mì nướng được hiển thị bằng tin nhắn

ShadowToast.showedToast("expected message") 

Nếu bạn đang sử dụng một tùy chỉnh bánh mì nướng

ShadowToast.showedToast("expected message", R.id.yourToastId) 
Các vấn đề liên quan