Tập tin mô phỏng Python

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úc

Vấ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]
4

def 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à gây ra ngoại lệ

Bước đầu tiên là tạo đối tượng

with mock.patch['__builtin__.open', mock_open]:
    ...
1

read_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 định

Tiế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]
3

with 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]:
    ...
1

read_data = json.dumps[{'a': 1, 'b': 2, 'c': 3}]
mock_open = mock.mock_open[read_data=read_data]
9

Trong 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]
0

Vớ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ệ

Mô hình trong Python là gì?

Chế nhạo đơn giản là hành động thay thế một phần của ứng dụng mà bạn đang thử nghiệm bằng một phiên bản giả của phần đó được gọi là giả . Thay vì gọi triển khai thực tế, bạn sẽ gọi mô hình và sau đó đưa ra các xác nhận về những gì bạn mong đợi sẽ xảy ra.

Tệp giả là gì?

Mocking có nghĩa là tạo phiên bản giả mạo của dịch vụ bên ngoài hoặc nội bộ có thể thay thế cho dịch vụ thực, giúp thử nghiệm của bạn chạy nhanh hơn và đáng tin cậy hơn. Khi triển khai của bạn tương tác với các thuộc tính của đối tượng, thay vì chức năng hoặc hành vi của đối tượng, có thể sử dụng mô hình giả

Làm cách nào để mô phỏng chức năng trong Python?

Làm cách nào để chúng tôi mô phỏng bằng Python? . Khi bản vá chặn cuộc gọi, nó sẽ trả về một đối tượng MagicMock theo mặc định. Bằng cách đặt các thuộc tính trên đối tượng MagicMock, bạn có thể mô phỏng lệnh gọi API để trả về bất kỳ giá trị nào bạn muốn hoặc đưa ra một Ngoại lệ. using patch to hijack an API function or object creation call. When patch intercepts a call, it returns a MagicMock object by default. By setting properties on the MagicMock object, you can mock the API call to return any value you want or raise an Exception .

Pytest giả là gì?

Trong pytest , chế nhạo có thể thay thế giá trị trả về của một hàm trong một hàm . Điều này hữu ích để kiểm tra chức năng mong muốn và thay thế giá trị trả về của hàm lồng trong chức năng mong muốn mà chúng tôi đang kiểm tra.

Chủ Đề