翻譯首頁web
在某些狀況下,單元測試依賴的類可能從實時Web服務或數據庫中獲取數據。這時可能很不方便,緣由以下:數據庫
因此,與其依賴實時的web服務或者數據庫,不如你「mock」這些依賴。mock容許咱們模擬一個實時的web服務或者數據庫而且根據狀況返回特定結果。json
通常來講,你能夠經過建立類的替代實現來模擬依賴項。你能夠本身寫這些替代實現或者使用更便捷的Mockito package。瀏覽器
下面的步驟講解了使用Mockito package
的基礎操做,更多操做請查看Mockito package documentation。bash
mockito
和 test
依賴。http.Client
的測試文件。mockito
和 test
依賴。要想使用 mockito package
,你首先須要添加它和 flutter_test
到 pubspec.yaml
文件裏,添加位置在dev_dependencies下面。服務器
你也可使用 http package
,在dependencies下面添加該依賴便可。網絡
dependencies:
http: <newest_version>
dev_dependencies:
test: <newest_version>
mockito: <newest_version>
複製代碼
在本例中,你將對從Internet方法獲取數據的fetchpost函數進行單元測試。爲了測試這個函數,你須要作以下2點改變:async
2.使用提供的client從網絡獲取數據,而不是直接使用http.get方法,不然會很難模擬數據。ide
這個測試函數看起來應該是這樣的:函數
Future<Post> fetchPost(http.Client client) async {
final response =
await client.get('https://jsonplaceholder.typicode.com/posts/1');
if (response.statusCode == 200) {
// If the call to the server was successful, parse the JSON
return Post.fromJson(json.decode(response.body));
} else {
// If that call was not successful, throw an error.
throw Exception('Failed to load post');
}
}
複製代碼
http.Client
的測試文件。下一步,建立一個測試文件和一個 MockClient
類。根據單元測試介紹中的建議,在根目錄的 test
文件夾下建立一個叫 fetch_post_test.dart
的文件。
這個 MockClient
類實現了 http.Client
。這將容許你將 MockClient
做爲參數傳遞到 fetchPost
函數,而且容許你在每一個測試裏返回不一樣的結果。
// Create a MockClient using the Mock class provided by the Mockito package.
// Create new instances of this class in each test.
class MockClient extends Mock implements http.Client {}
main() {
// Tests go here
}
複製代碼
若是你思考一下 fetchPost
函數,會想到它只能返回下面的2個結果中的一個:
所以,你想要測試這兩個結果。你可使用 MockClient
返回獲取數據成功的測試結果,也能夠返回一個獲取數據失敗的測試結果。
爲了實現這一點,咱們使用Mockito
提供的when
函數。
// Create a MockClient using the Mock class provided by the Mockito package.
// Create new instances of this class in each test.
class MockClient extends Mock implements http.Client {}
main() {
group('fetchPost', () {
test('returns a Post if the http call completes successfully', () async {
final client = MockClient();
// Use Mockito to return a successful response when it calls the
// provided http.Client.
when(client.get('https://jsonplaceholder.typicode.com/posts/1'))
.thenAnswer((_) async => http.Response('{"title": "Test"}', 200));
expect(await fetchPost(client), isInstanceOf<Post>());
});
test('throws an exception if the http call completes with an error', () {
final client = MockClient();
// Use Mockito to return an unsuccessful response when it calls the
// provided http.Client.
when(client.get('https://jsonplaceholder.typicode.com/posts/1'))
.thenAnswer((_) async => http.Response('Not Found', 404));
expect(fetchPost(client), throwsException);
});
});
}
複製代碼
既然你如今寫好了fetchPost
的單元測試,那麼就能夠運行它了。
dart test/fetch_post_test.dart
複製代碼
你也可使用單元測試介紹裏介紹過的你喜歡的編譯器裏運行測試
在這個例子裏,你已經學會了如何使用Mockito
去測試依賴web服務器或者數據庫的函數或者類。這只是一個簡短的 Mockito library
和模擬概念的介紹。更多信息請查看 Mockito package。