Đối tượng tệp giả 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à khiến một ngoại lệ được đưa ra

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ệ

Mock nghĩa là gì trong Python?

mock là thư viện để thử nghiệm bằng 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. đơn vị nhất. mock cung cấp một lớp Mock cốt lõi loại bỏ nhu cầu tạo một loạt sơ khai trong bộ thử nghiệm của bạn.

Bạn có thể thử nhập bằng Python không?

Trình mô phỏng nhập khẩu Python cung cấp một cách dễ dàng để nhập mô-đun và mô phỏng các thành phần phụ thuộc của mô-đun theo cách riêng biệt .

Mục đích của một đối tượng giả là gì?

Việc sử dụng các đối tượng giả định cho phép các nhà phát triển tập trung kiểm tra hành vi của hệ thống đang được kiểm tra mà không phải lo lắng về các thành phần phụ thuộc của hệ thống . Ví dụ: kiểm tra một thuật toán phức tạp dựa trên nhiều đối tượng ở các trạng thái cụ thể có thể được thể hiện rõ ràng bằng cách sử dụng các đối tượng giả thay cho các đối tượng thực.

Điều gì xảy ra khi bạn chế nhạo một đối tượng?

Trong lập trình hướng đối tượng, đối tượng giả là đối tượng mô phỏng bắt chước hành vi của các phần nhỏ nhất có thể kiểm tra của ứng dụng theo cách được kiểm soát.