2015-01-26 18 views
11

Kịch bản là khi người dùng nhấp vào nút "Tải xuống", dữ liệu (nhạc/hình ảnh, v.v.) bắt đầu được tải xuống từ internet. Khi quá trình tải xuống hoàn tất, nút sẽ thay đổi văn bản nhãn thành "Mở". Sau đó, người dùng nhấp vào nút "Mở" đó. Những gì tôi đã thực hiện sofar là:Cách sử dụng Espresso Idling Resource

onView(allOf(withId(R.id.button),withText("Download"))).check(matches(isClickable())).perform(click()); 
try { 
    Thread.sleep(delayedTime); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
onView(allOf(withId(R.id.button),withText("Open"))).check(matches(isClickable())).perform(click()); 

Đôi khi kiểm tra đạt, đôi khi nó không. Lý do đôi khi nó thất bại là "No views in hierarchy found matching: (with id: something:id/button and with text: is "Open"). Và tôi biết bằng cách sử dụng Thread.sleep trong Espresso cũng là một thói quen không tốt. Tôi đã đọc về Espresso's Idling Resource, nhưng nó không có ý nghĩa với tôi và tôi không biết làm thế nào tôi có thể áp dụng điều đó trong trường hợp cụ thể này.

+0

Đối với ThreadPools, hãy thử sử dụng: http://luongbui.com/thread-pool-idlingresource-for-espresso/ Tôi đã đưa ra một ví dụ đầy đủ để hiển thị cách sử dụng IdlingResource của tôi, chỉ cần đăng ký và hủy đăng ký trong mã thử nghiệm. Tâm trí bạn, bạn cần cùng một ví dụ của ThreadPool bạn đang sử dụng trong mã sản xuất. Nhà máy mẫu hoặc Dagger là rất khuyến khích. – luong

Trả lời

28

Tài nguyên không hoạt động thực sự là những điểm khó nhất của Espresso.

Bạn nên triển khai nó nếu trong thử nghiệm của mình, bạn phải đợi/đồng bộ hóa với một số tác vụ nền không đồng bộ. Theo mặc định, Espresso đợi các hoạt động giao diện người dùng trong hàng đợi tin nhắn hiện tại để xử lý và mặc định AsyncTasks (đồng bộ hóa với nhóm chủ đề AsyncTask mặc định) để hoàn thành trước khi nó chuyển sang hoạt động thử nghiệm tiếp theo. Vui lòng xem xét điều này cho AsyncTasks. Tuy nhiên, nếu bạn bắt đầu một chủ đề khác ví dụ giao tiếp với một số dịch vụ web, bạn nên sử dụng IdlingResource.

Bất kỳ Thread.sleep nào bạn có thể cần là tín hiệu cho thấy bạn có thể cần tài nguyên không tải.

Bây giờ về cách viết một tài nguyên không tải. Nó có thể dễ dàng được thực hiện bởi nhà phát triển mã bởi vì bây giờ họ làm thế nào họ đang làm cho điểm đánh giá này.

Nó được coi là một cái gì đó như thế này:

public class DownloadIdlingResource extends BaseIdlingResource { ....} 

Đây là vụ phải xác định khi cập khu vực này là nhàn rỗi hay không .....

Các kiểm tra, mà muốn nói rằng Espresso nó cần phải đợi cho tài nguyên không hoạt động này, nghĩa vụ phải xác định trong quá trình khởi tạo lớp thử nghiệm tài nguyên không hoạt động này (setUp(), v.v.) hoặc kích hoạt nó khi cần. Nó có nghĩa là bạn có một cái gì đó để chờ đợi nhưng nó chưa được kích hoạt. Ví dụ, tài nguyên tải xuống không hoạt động có thể có người nghe để đặt tài nguyên không tải thành không hoạt động (setIdle(false)) khi tải xuống được khởi động và đặt trở lại chế độ không hoạt động khi hoàn tất (setIdle(true)). Espresso đang tiếp tục tất cả các nhân viên khác nếu tất cả các tài nguyên không hoạt động không hoạt động (không có gì phải đợi để hoàn thành). Chi tiết triển khai tài nguyên không hoạt động mạnh phụ thuộc vào việc triển khai ứng dụng.

Điều gì có thể nói về chạy không tải tài nguyên nói chung:

1) isIdleNow() thực hiện logic khi tài nguyên là nhàn rỗi

2) registerIdleTransitionCallback sẽ được gọi bởi Espresso khi tài nguyên được đăng ký và sẽ cung cấp cho bạn a ResourceCallback.

3) Khi tài nguyên chuyển từ bận sang chế độ chờ, thực tế bạn nhận được cuộc gọi lại từ tác vụ nền của bạn mà thao tác đã hoàn thành (dữ liệu bản đồ đã được tải xuống hoặc tải xuống bị hủy) bạn phải callonTransitionToIdle() trên đăng ký ResourceCallback.

4) Trong getName() bạn phải trả lại tên của tài nguyên được sử dụng để ghi nhật ký.

Hãy cẩn thận không có bế tắc như tài nguyên không tải. Có một thời gian chờ cho các nguồn tài nguyên không tải. Kiểm tra có thể bị gián đoạn bởi thông báo giải thích những gì là xấu với nguồn tài nguyên không tải.

Tôi xin lỗi vì không thể viết các ví dụ cụ thể hơn nhưng thực sự phụ thuộc vào việc triển khai ứng dụng của bạn.

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