Kiểm tra khối

Tram Ho

Hiện nay Unit test đã được áp dụng rộng rãi và mạnh mẽ, rất nhiều công ty đã coi đây là điều bắt buộc cho mỗi dự án của họ. Trong các dự án mobile nói chung và flutter nói riêng thì việc unit test cũng rất quan trọng. Trong bài viết lần này, chúng ta sẽ cùng nhau tìm hiểu cách viết unit test khi sử dụng thư viện bloc, một thư viện quản lý state rất hiệu quả.

Để đơn giản, nhanh chóng và dễ hiểu, chúng ta sẽ sử dụng một project mẫu trên https://bloclibrary.dev/#/flutterweathertutorial, các bạn dành chút thời gian đọc project này nhé

Trong flutter project, quản lý state là quan trọng, ở giới hạn bài viết, chúng ta sẽ viết unit test cho mỗi bloc của project trên. Mục tiêu của unit test cho bloc chính là tương ứng với mỗi event, chúng ta sẽ nhận được các state tuần tự tương ứng.

Add thư viện test cho project

Chúng ta sẽ add 3 thư viện cần thiết sau

  1. flutter test sẽ cung cấp các phương thức để có thể test cho dart và flutter
  2. bloc_test sẽ cũng cấp các phương thức và cách thức để có thể test và tương tác với bloc
  3. mockito sẽ giúp chúng ta mock một số object.

Sau khi add, các bạn nhớ flutter pub get nhé

Bloc và các events và states

Events

Với project mẫu ở trên, chúng ta sẽ có 2 events chính sau: FetchWeatherRefreshWeather

States

Tương ứng chúng ta có các states sau: WeatherEmpty, WeatherLoading, WeatherLoadedWeatherError

Bloc

Phần xử lý state chính của chúng ta là ở đây WeatherBloc

Viết unit test

Định nghĩa các test case

  1. Trường hợp repository bị null => expect: throwsAssertionError.
  2. Trạng thái state lúc khởi tạo bloc => expect: WeatherEmpty().
  3. Event FetchWeather
  • thành công => expect các states tuần tự là: [WeatherLoading, WeatherLoaded]
  • không thành công => expect các states tuần tự là: [WeatherLoading, WeatherError]
  1. Event RefreshWeather
  • thành công => expect state [WeatherLoaded]
  • không thành công => expect không có state nào được trả ra.

Như vậy chúng ta sẽ có tổng cộng 6 testcases.

Mock repository class

WeatherBloc cần 1 repository thông qua constructor nên chúng ta sẽ mock class này để sử dụng cho test

Tạo expect data

Project sẽ get dữ liệu về thời tiết của một địa điểm, nên chúng ta sẽ tạo 1 expect data như sau

Khởi tạo các object

Chúng ta sử dụng method setUp để khởi tạo các object ban đầu

Viết unit test

  1. Trường hợp repository null

  1. Trạng thái khởi tạo

  1. FetchWeather

  1. RefreshWeather

Full test file

Run test

Các bạn có thể run từng test case, từng group hoặc từng file test. Để chạy all test thì các bạn chạy lệnh sau nhé flutter test.

Cảm ơn các bạn đã đọc bài viết. Happy coding!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo