Trong bài viết trước của tôi, tôi đã thảo luận về cách tạo một bài kiểm tra đơn vị cho một hàm Python đưa ra một ngoại lệ. Kỹ thuật này cho phép một chức năng được gọi với các tham số có thể gây ra ngoại lệ mà không gây tử vong cho quá trình thực thi của nó
Một kịch bản khác có thể áp dụng mô hình tương tự là khi chế nhạo một hàm. mock là một thư viện để thử nghiệm trong Python. Nó cho phép bạn thay thế các phần của hệ thống đang thử nghiệm bằng các đối tượng giả và đưa ra xác nhận về cách chúng đã được sử dụng
Trong ví dụ này, chúng ta sẽ tận dụng hàm
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
2, hàm xử lý các thuộc tính cấp mô-đun và lớp trong phạm vi kiểm tra. Khi sử dụng read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
2, đối tượng bạn chỉ định sẽ được thay thế bằng mô hình [hoặc đối tượng khác] trong quá trình kiểm tra và được khôi phục khi quá trình kiểm tra kết thúcVấn đề
Ví dụ: giả sử tôi có hàm
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
4def open_json_file[filename]:
"""
Attempt to open and deserialize a JSON file.
:param filename: name of the JSON file
:type filename: str
:return: dict of log
:rtype: dict
"""
try:
with open[filename] as f:
try:
return json.load[f]
except ValueError:
raise ValueError['{} is not valid JSON.'.format[filename]]
except IOError:
raise IOError['{} does not exist.'.format[filename]]
Làm cách nào để giả định
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
0 để nó không được gọi với đối số đã truyền? Dung dịch
Giải pháp là sử dụng kết hợp với.
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
3 là một hàm trợ giúp để tạo một bản giả nhằm thay thế việc sử dụng hàm có sẵn read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
0. read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
4 cho phép đóng gói một ngoại lệ, điều đó có nghĩa là thử nghiệm có thể đưa ra một ngoại lệ mà không cần thoát khỏi quá trình thực thi, như trường hợp thông thường đối với các ngoại lệ chưa được xử lý. Bằng cách lồng cả read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
2 và read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
4, chúng ta có thể tìm hiểu về dữ liệu được trả về bởi read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
0 và khiến một ngoại lệ được đưa raBước đầu tiên là tạo đối tượng
with mock.patch['__builtin__.open', mock_open]:
...
1read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
Ghi chú.
with mock.patch['__builtin__.open', mock_open]:
...
2 là một chuỗi để phương thức with mock.patch['__builtin__.open', mock_open]:
...
3 của tệp xử lý trả về. Đây là một chuỗi rỗng theo mặc địnhTiếp theo, sử dụng
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
2 làm trình quản lý bối cảnh, read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
0 có thể được vá bằng đối tượng mới, read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
3with mock.patch['__builtin__.open', mock_open]:
...
Trong bối cảnh này, một cuộc gọi đến
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
0 trả về read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
3, đối tượng with mock.patch['__builtin__.open', mock_open]:
...
1read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
9Trong trường hợp ví dụ của chúng tôi
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
0Với
read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
4 dưới dạng ngữ cảnh lồng nhau, sau đó chúng tôi có thể kiểm tra ngoại lệ đã nêu khi tệp không chứa JSON hợp lệ