Cuộc gọi hàm tạo mô phỏng Python

Khi bạn đang viết mã mạnh mẽ, các bài kiểm tra là điều cần thiết để xác minh rằng logic ứng dụng của bạn là chính xác, đáng tin cậy và hiệu quả. Tuy nhiên, giá trị của các bài kiểm tra của bạn phụ thuộc vào mức độ chúng thể hiện các tiêu chí này. Những trở ngại như logic phức tạp và sự phụ thuộc không thể đoán trước khiến việc viết các bài kiểm tra có giá trị trở nên khó khăn. Thư viện đối tượng mô phỏng Python,

>>> mock.some_attribute

>>> mock.do_something()

5, có thể giúp bạn vượt qua những trở ngại này

Đến cuối bài viết này, bạn sẽ có thể

  • Tạo các đối tượng mô phỏng Python bằng cách sử dụng
    >>> mock.some_attribute
    
    >>> mock.do_something()
    
    
    6
  • Khẳng định bạn đang sử dụng các đối tượng như bạn dự định
  • Kiểm tra dữ liệu sử dụng được lưu trữ trên mô hình Python của bạn
  • Định cấu hình các khía cạnh nhất định của các đối tượng mô phỏng Python của bạn
  • Thay thế mô phỏng của bạn cho các đối tượng thực bằng cách sử dụng
    >>> mock.some_attribute
    
    >>> mock.do_something()
    
    
    7
  • Tránh các vấn đề phổ biến vốn có trong Python mocking

Bạn sẽ bắt đầu bằng cách xem chế nhạo là gì và nó sẽ cải thiện bài kiểm tra của bạn như thế nào

Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới

Mocking là gì?

Một đối tượng giả thay thế và bắt chước một đối tượng thực trong môi trường thử nghiệm. Nó là một công cụ linh hoạt và mạnh mẽ để

Một lý do để sử dụng các đối tượng mô phỏng Python là để kiểm soát hành vi mã của bạn trong quá trình thử nghiệm

Ví dụ: nếu mã của bạn tạo các yêu cầu HTTP cho các dịch vụ bên ngoài, thì các thử nghiệm của bạn chỉ thực thi có thể dự đoán được cho đến khi các dịch vụ đó hoạt động như bạn mong đợi. Đôi khi, một thay đổi tạm thời trong hành vi của các dịch vụ bên ngoài này có thể gây ra lỗi gián đoạn trong bộ thử nghiệm của bạn

Do đó, sẽ tốt hơn nếu bạn kiểm tra mã của mình trong một môi trường được kiểm soát. Thay thế yêu cầu thực tế bằng một đối tượng giả sẽ cho phép bạn mô phỏng sự ngừng hoạt động của dịch vụ bên ngoài và các phản hồi thành công theo cách có thể dự đoán được

Đôi khi, rất khó để kiểm tra một số khu vực nhất định trong cơ sở mã của bạn. Những lĩnh vực như vậy bao gồm

>>> mock.some_attribute

>>> mock.do_something()

8 khối và
>>> mock.some_attribute

>>> mock.do_something()

9 câu khó thỏa mãn. Sử dụng các đối tượng mô phỏng Python có thể giúp bạn kiểm soát đường dẫn thực thi mã của mình để tiếp cận các khu vực này và cải thiện phạm vi mã của bạn

Một lý do khác để sử dụng các đối tượng giả là để hiểu rõ hơn cách bạn đang sử dụng các đối tượng thực của chúng trong mã của mình. Đối tượng mô phỏng Python chứa dữ liệu về cách sử dụng mà bạn có thể kiểm tra, chẳng hạn như

  • Nếu bạn đã gọi một phương thức
  • Cách bạn gọi phương thức
  • Tần suất bạn gọi phương thức

Hiểu chức năng của một đối tượng giả là bước đầu tiên để học cách sử dụng một đối tượng giả.

Bây giờ, bạn sẽ thấy cách sử dụng các đối tượng giả trong Python

Loại bỏ các quảng cáo

Thư viện mô phỏng Python

Thư viện đối tượng mô phỏng Python là

>>> mock.some_attribute

>>> mock.do_something()

5. Nó cung cấp một cách dễ dàng để giới thiệu mô phỏng vào các bài kiểm tra của bạn

Ghi chú. Thư viện tiêu chuẩn bao gồm

>>> mock.some_attribute

>>> mock.do_something()

5 trong Python 3. 3 trở lên. Nếu bạn đang sử dụng phiên bản Python cũ hơn, bạn sẽ cần cài đặt backport chính thức của thư viện. Để làm như vậy, hãy cài đặt
>>> json = Mock()
>>> json.dumps()

2 từ PyPI

________số 8_______

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp một lớp có tên là
>>> mock.some_attribute

>>> mock.do_something()

6 mà bạn sẽ sử dụng để bắt chước các đối tượng thực trong cơ sở mã của mình.
>>> mock.some_attribute

>>> mock.do_something()

6 cung cấp dữ liệu sâu sắc và linh hoạt đáng kinh ngạc. Điều này, cùng với các lớp con của nó, sẽ đáp ứng hầu hết các nhu cầu mô phỏng Python mà bạn sẽ gặp phải trong các bài kiểm tra của mình

Thư viện cũng cung cấp một chức năng, được gọi là

>>> mock.some_attribute

>>> mock.do_something()

7, thay thế các đối tượng thực trong mã của bạn bằng các phiên bản
>>> mock.some_attribute

>>> mock.do_something()

6. Bạn có thể sử dụng
>>> mock.some_attribute

>>> mock.do_something()

7 làm công cụ trang trí hoặc trình quản lý bối cảnh, cho phép bạn kiểm soát phạm vi mà đối tượng sẽ được mô phỏng. Sau khi thoát khỏi phạm vi được chỉ định,
>>> mock.some_attribute

>>> mock.do_something()

7 sẽ dọn sạch mã của bạn bằng cách thay thế các đối tượng bị mô phỏng bằng đối tượng ban đầu của chúng

Cuối cùng,

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp giải pháp cho một số vấn đề vốn có trong các đối tượng chế nhạo

Bây giờ, bạn đã hiểu rõ hơn về chế nhạo là gì và thư viện mà bạn sẽ sử dụng để làm điều đó. Hãy đi sâu vào và khám phá những tính năng và chức năng mà

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp

Đối tượng >>> mock.some_attribute >>> mock.do_something() 6

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp một lớp cơ sở cho các đối tượng mô phỏng có tên là
>>> mock.some_attribute

>>> mock.do_something()

6. Các trường hợp sử dụng cho
>>> mock.some_attribute

>>> mock.do_something()

6 thực tế là vô hạn vì
>>> mock.some_attribute

>>> mock.do_something()

6 rất linh hoạt

Bắt đầu bằng cách khởi tạo một phiên bản

>>> mock.some_attribute

>>> mock.do_something()

6 mới

>>>

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

Bây giờ, bạn có thể thay thế một đối tượng trong mã của mình bằng

>>> mock.some_attribute

>>> mock.do_something()

6 mới. Bạn có thể làm điều này bằng cách chuyển nó làm đối số cho một hàm hoặc bằng cách xác định lại một đối tượng khác

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock

Khi bạn thay thế một đối tượng trong mã của mình,

>>> mock.some_attribute

>>> mock.do_something()

6 phải trông giống như đối tượng thực mà nó đang thay thế. Nếu không, mã của bạn sẽ không thể sử dụng
>>> mock.some_attribute

>>> mock.do_something()

6 thay cho đối tượng ban đầu

Ví dụ: nếu bạn đang chế nhạo thư viện

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()

>>> json.loads('{"key": "value"}')


>>> # You know that you called loads() so you can
>>> # make assertions to test that expectation
.. json.loads.assert_called()
>>> json.loads.assert_called_once()
>>> json.loads.assert_called_with('{"key": "value"}')
>>> json.loads.assert_called_once_with('{"key": "value"}')

>>> json.loads('{"key": "value"}')


>>> # If an assertion fails, the mock will raise an AssertionError
.. json.loads.assert_called_once()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'loads' to have been called once. Called 2 times.

>>> json.loads.assert_called_once_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
    raise AssertionError(msg)
AssertionError: Expected 'loads' to be called once. Called 2 times.

>>> json.loads.assert_not_called()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
    raise AssertionError(msg)
AssertionError: Expected 'loads' to not have been called. Called 2 times.
1 và chương trình của bạn gọi
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()

>>> json.loads('{"key": "value"}')


>>> # You know that you called loads() so you can
>>> # make assertions to test that expectation
.. json.loads.assert_called()
>>> json.loads.assert_called_once()
>>> json.loads.assert_called_with('{"key": "value"}')
>>> json.loads.assert_called_once_with('{"key": "value"}')

>>> json.loads('{"key": "value"}')


>>> # If an assertion fails, the mock will raise an AssertionError
.. json.loads.assert_called_once()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'loads' to have been called once. Called 2 times.

>>> json.loads.assert_called_once_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
    raise AssertionError(msg)
AssertionError: Expected 'loads' to be called once. Called 2 times.

>>> json.loads.assert_not_called()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
    raise AssertionError(msg)
AssertionError: Expected 'loads' to not have been called. Called 2 times.
2, thì đối tượng giả lập Python của bạn cũng phải chứa
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()

>>> json.loads('{"key": "value"}')


>>> # You know that you called loads() so you can
>>> # make assertions to test that expectation
.. json.loads.assert_called()
>>> json.loads.assert_called_once()
>>> json.loads.assert_called_with('{"key": "value"}')
>>> json.loads.assert_called_once_with('{"key": "value"}')

>>> json.loads('{"key": "value"}')


>>> # If an assertion fails, the mock will raise an AssertionError
.. json.loads.assert_called_once()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'loads' to have been called once. Called 2 times.

>>> json.loads.assert_called_once_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
    raise AssertionError(msg)
AssertionError: Expected 'loads' to be called once. Called 2 times.

>>> json.loads.assert_not_called()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
    raise AssertionError(msg)
AssertionError: Expected 'loads' to not have been called. Called 2 times.
2

Tiếp theo, bạn sẽ thấy cách

>>> mock.some_attribute

>>> mock.do_something()

6 đối phó với thử thách này

Các thuộc tính và phương thức lười biếng

Một

>>> mock.some_attribute

>>> mock.do_something()

6 phải mô phỏng bất kỳ đối tượng nào mà nó thay thế. Để đạt được sự linh hoạt như vậy, nó

>>>

>>> mock.some_attribute

>>> mock.do_something()

>>> mock.some_attribute

>>> mock.do_something()

6 có thể tạo các thuộc tính tùy ý một cách nhanh chóng nên nó phù hợp để thay thế bất kỳ đối tượng nào

Sử dụng một ví dụ từ trước đó, nếu bạn đang chế nhạo thư viện

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()

>>> json.loads('{"key": "value"}')


>>> # You know that you called loads() so you can
>>> # make assertions to test that expectation
.. json.loads.assert_called()
>>> json.loads.assert_called_once()
>>> json.loads.assert_called_with('{"key": "value"}')
>>> json.loads.assert_called_once_with('{"key": "value"}')

>>> json.loads('{"key": "value"}')


>>> # If an assertion fails, the mock will raise an AssertionError
.. json.loads.assert_called_once()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'loads' to have been called once. Called 2 times.

>>> json.loads.assert_called_once_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
    raise AssertionError(msg)
AssertionError: Expected 'loads' to be called once. Called 2 times.

>>> json.loads.assert_not_called()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
    raise AssertionError(msg)
AssertionError: Expected 'loads' to not have been called. Called 2 times.
1 và bạn gọi
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()

>>> json.loads('{"key": "value"}')


>>> # You know that you called loads() so you can
>>> # make assertions to test that expectation
.. json.loads.assert_called()
>>> json.loads.assert_called_once()
>>> json.loads.assert_called_with('{"key": "value"}')
>>> json.loads.assert_called_once_with('{"key": "value"}')

>>> json.loads('{"key": "value"}')


>>> # If an assertion fails, the mock will raise an AssertionError
.. json.loads.assert_called_once()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'loads' to have been called once. Called 2 times.

>>> json.loads.assert_called_once_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
    raise AssertionError(msg)
AssertionError: Expected 'loads' to be called once. Called 2 times.

>>> json.loads.assert_not_called()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
    raise AssertionError(msg)
AssertionError: Expected 'loads' to not have been called. Called 2 times.
2, đối tượng giả lập Python sẽ tạo phương thức để giao diện của nó có thể khớp với giao diện của thư viện

>>>

>>> json = Mock()
>>> json.dumps()

Lưu ý hai đặc điểm chính của phiên bản chế giễu này của

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()

>>> json.loads('{"key": "value"}')


>>> # You know that you called loads() so you can
>>> # make assertions to test that expectation
.. json.loads.assert_called()
>>> json.loads.assert_called_once()
>>> json.loads.assert_called_with('{"key": "value"}')
>>> json.loads.assert_called_once_with('{"key": "value"}')

>>> json.loads('{"key": "value"}')


>>> # If an assertion fails, the mock will raise an AssertionError
.. json.loads.assert_called_once()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'loads' to have been called once. Called 2 times.

>>> json.loads.assert_called_once_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
    raise AssertionError(msg)
AssertionError: Expected 'loads' to be called once. Called 2 times.

>>> json.loads.assert_not_called()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
    raise AssertionError(msg)
AssertionError: Expected 'loads' to not have been called. Called 2 times.
2

  1. Không giống như , phương thức giả lập này không yêu cầu đối số. Trên thực tế, nó sẽ chấp nhận mọi đối số mà bạn chuyển cho nó

  2. Giá trị trả về của

    >>> from unittest.mock import Mock
    
    >>> # Create a mock object
    .. json = Mock()
    
    >>> json.loads('{"key": "value"}')
    
    
    >>> # You know that you called loads() so you can
    >>> # make assertions to test that expectation
    .. json.loads.assert_called()
    >>> json.loads.assert_called_once()
    >>> json.loads.assert_called_with('{"key": "value"}')
    >>> json.loads.assert_called_once_with('{"key": "value"}')
    
    >>> json.loads('{"key": "value"}')
    
    
    >>> # If an assertion fails, the mock will raise an AssertionError
    .. json.loads.assert_called_once()
    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'loads' to have been called once. Called 2 times.
    
    >>> json.loads.assert_called_once_with('{"key": "value"}')
    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
        raise AssertionError(msg)
    AssertionError: Expected 'loads' to be called once. Called 2 times.
    
    >>> json.loads.assert_not_called()
    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
        raise AssertionError(msg)
    AssertionError: Expected 'loads' to not have been called. Called 2 times.
    
    2 cũng là một
    >>> mock.some_attribute
    
    >>> mock.do_something()
    
    
    6. Khả năng của
    >>> mock.some_attribute
    
    >>> mock.do_something()
    
    
    6 để xác định đệ quy các giả khác cho phép bạn sử dụng các giả trong các tình huống phức tạp

>>>

>>> json = Mock()
>>> json.loads('{"k": "v"}').get('k')

Bởi vì giá trị trả về của mỗi phương thức mô phỏng cũng là một

>>> mock.some_attribute

>>> mock.do_something()

6, nên bạn có thể sử dụng các mô phỏng của mình theo nhiều cách

Mô phỏng rất linh hoạt, nhưng chúng cũng cung cấp nhiều thông tin. Tiếp theo, bạn sẽ tìm hiểu cách sử dụng mô phỏng để hiểu rõ hơn về mã của mình

Loại bỏ các quảng cáo

Xác nhận và Kiểm tra

>>> mock.some_attribute

>>> mock.do_something()

6 phiên bản lưu trữ dữ liệu về cách bạn sử dụng chúng. Chẳng hạn, bạn có thể xem liệu bạn đã gọi một phương thức hay chưa, bạn đã gọi phương thức đó như thế nào, v.v. Có hai cách chính để sử dụng thông tin này

Đầu tiên, bạn có thể khẳng định rằng chương trình của bạn đã sử dụng một đối tượng như bạn mong đợi

>>>

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()

>>> json.loads('{"key": "value"}')


>>> # You know that you called loads() so you can
>>> # make assertions to test that expectation
.. json.loads.assert_called()
>>> json.loads.assert_called_once()
>>> json.loads.assert_called_with('{"key": "value"}')
>>> json.loads.assert_called_once_with('{"key": "value"}')

>>> json.loads('{"key": "value"}')


>>> # If an assertion fails, the mock will raise an AssertionError
.. json.loads.assert_called_once()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 795, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'loads' to have been called once. Called 2 times.

>>> json.loads.assert_called_once_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 824, in assert_called_once_with
    raise AssertionError(msg)
AssertionError: Expected 'loads' to be called once. Called 2 times.

>>> json.loads.assert_not_called()
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 777, in assert_not_called
    raise AssertionError(msg)
AssertionError: Expected 'loads' to not have been called. Called 2 times.

>>> json = Mock()
>>> json.loads(s='{"key": "value"}')
>>> json.loads.assert_called_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 814, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: Expected call: loads('{"key": "value"}')
Actual call: loads(s='{"key": "value"}')
>>> json.loads.assert_called_with(s='{"key": "value"}')
6 đảm bảo rằng bạn đã gọi phương thức giả lập trong khi
>>> json = Mock()
>>> json.loads(s='{"key": "value"}')
>>> json.loads.assert_called_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 814, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: Expected call: loads('{"key": "value"}')
Actual call: loads(s='{"key": "value"}')
>>> json.loads.assert_called_with(s='{"key": "value"}')
7 kiểm tra xem bạn đã gọi phương thức đó đúng một lần chưa

Cả hai hàm xác nhận đều có các biến thể cho phép bạn kiểm tra các đối số được truyền cho phương thức giả lập

  • >>> json = Mock()
    >>> json.loads(s='{"key": "value"}')
    >>> json.loads.assert_called_with('{"key": "value"}')
    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 814, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: Expected call: loads('{"key": "value"}')
    Actual call: loads(s='{"key": "value"}')
    >>> json.loads.assert_called_with(s='{"key": "value"}')
    
    8
  • >>> json = Mock()
    >>> json.loads(s='{"key": "value"}')
    >>> json.loads.assert_called_with('{"key": "value"}')
    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 814, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: Expected call: loads('{"key": "value"}')
    Actual call: loads(s='{"key": "value"}')
    >>> json.loads.assert_called_with(s='{"key": "value"}')
    
    9

Để chuyển các xác nhận này, bạn phải gọi phương thức giả với cùng các đối số mà bạn chuyển cho phương thức thực tế

>>>

>>> json = Mock()
>>> json.loads(s='{"key": "value"}')
>>> json.loads.assert_called_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 814, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: Expected call: loads('{"key": "value"}')
Actual call: loads(s='{"key": "value"}')
>>> json.loads.assert_called_with(s='{"key": "value"}')

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
0 đã đưa ra một
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
1 bởi vì nó dự kiến ​​bạn gọi với một đối số vị trí, nhưng bạn thực sự gọi nó với một đối số từ khóa.
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
3 nhận định này đúng

Thứ hai, bạn có thể xem các thuộc tính đặc biệt để hiểu ứng dụng của bạn đã sử dụng một đối tượng như thế nào

>>>

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]

Bạn có thể viết bài kiểm tra bằng cách sử dụng các thuộc tính này để đảm bảo rằng các đối tượng của bạn hoạt động như bạn dự định

Giờ đây, bạn có thể tạo mô hình giả và kiểm tra dữ liệu sử dụng của chúng. Tiếp theo, bạn sẽ thấy cách tùy chỉnh các phương thức giả định để chúng trở nên hữu ích hơn trong môi trường thử nghiệm của bạn

Quản lý giá trị trả về của Mock

Một lý do để sử dụng mô phỏng là để kiểm soát hành vi mã của bạn trong quá trình kiểm tra. Một cách để làm điều này là chỉ định chức năng của. Hãy sử dụng một ví dụ để xem cách thức hoạt động của nó

Đầu tiên, tạo một tệp có tên

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4. Thêm
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
5, một hàm sử dụng thư viện
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
6 của Python để xác định xem hôm nay có phải là một ngày trong tuần hay không. Cuối cùng, viết một bài kiểm tra khẳng định rằng chức năng hoạt động như mong đợi

from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()

Vì bạn đang kiểm tra nếu hôm nay là ngày trong tuần nên kết quả sẽ phụ thuộc vào ngày bạn chạy kiểm tra

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

0

Nếu lệnh này không tạo ra kết quả, xác nhận đã thành công. Thật không may, nếu bạn chạy lệnh vào cuối tuần, bạn sẽ nhận được một

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
1

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

1

Khi viết bài kiểm tra, điều quan trọng là đảm bảo rằng kết quả có thể dự đoán được. Bạn có thể sử dụng

>>> mock.some_attribute

>>> mock.do_something()

6 để loại bỏ sự không chắc chắn khỏi mã của mình trong quá trình thử nghiệm. Trong trường hợp này, bạn có thể giả định
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
6 và đặt
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
0 cho
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
1 thành một ngày mà bạn chọn

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

2

Trong ví dụ,

from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
1 là một phương thức giả định. Bạn đã loại bỏ sự không nhất quán bằng cách chỉ định một ngày cụ thể cho
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
0 của người mô phỏng. Theo cách đó, khi bạn gọi
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
1, nó sẽ trả về
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
6 mà bạn đã chỉ định

Trong bài kiểm tra đầu tiên, bạn đảm bảo rằng

from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
6 là một ngày trong tuần. Trong bài kiểm tra thứ hai, bạn xác minh rằng
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
7 không phải là một ngày trong tuần. Bây giờ, bạn chạy thử nghiệm vào ngày nào không quan trọng vì bạn đã chế nhạo
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
6 và có quyền kiểm soát hành vi của đối tượng

Đọc thêm. Mặc dù chế giễu

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
6 như thế này là một ví dụ thực hành tốt để sử dụng
>>> mock.some_attribute

>>> mock.do_something()

6, nhưng đã tồn tại một thư viện tuyệt vời để chế nhạo
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
6 có tên là
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

02

Khi xây dựng các bài kiểm tra của mình, bạn có thể sẽ gặp các trường hợp mà việc chế nhạo giá trị trả về của một hàm là không đủ. Điều này là do các chức năng thường phức tạp hơn luồng logic một chiều đơn giản

Đôi khi, bạn sẽ muốn làm cho các hàm trả về các giá trị khác nhau khi bạn gọi chúng nhiều lần hoặc thậm chí đưa ra các ngoại lệ. Bạn có thể làm điều này bằng cách sử dụng

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03

Loại bỏ các quảng cáo

Quản lý tác dụng phụ của Mock

Bạn có thể kiểm soát hành vi của mã bằng cách chỉ định chức năng giả. Một

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03 xác định điều gì sẽ xảy ra khi bạn gọi hàm giả lập

Để kiểm tra cách thức hoạt động của tính năng này, hãy thêm một chức năng mới vào

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

3

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

06 yêu cầu máy chủ
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

07 cho một loạt ngày nghỉ. Nếu máy chủ phản hồi thành công,
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

06 sẽ trả về một từ điển. Nếu không, phương thức sẽ trả về
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

09

Bạn có thể kiểm tra xem

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

06 sẽ phản hồi như thế nào khi hết thời gian kết nối bằng cách đặt
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

11

Đối với ví dụ này, bạn sẽ chỉ thấy mã có liên quan từ

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4. Bạn sẽ xây dựng một trường hợp thử nghiệm bằng thư viện
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

13 của Python

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

4

Bạn sử dụng

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

14 để xác minh rằng
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

06 đưa ra một ngoại lệ do tác dụng phụ mới của
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

16

Chạy thử nghiệm này để xem kết quả thử nghiệm của bạn

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

5

Nếu bạn muốn năng động hơn một chút, bạn có thể đặt

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03 thành hàm mà
>>> mock.some_attribute

>>> mock.do_something()

6 sẽ gọi khi bạn gọi phương thức giả lập của mình. Mô phỏng chia sẻ các đối số và giá trị trả về của hàm
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

6

Trước tiên, bạn đã tạo

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

20, lấy một URL, ghi nhật ký một số đầu ra bằng cách sử dụng
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

21, sau đó trả về phản hồi
>>> mock.some_attribute

>>> mock.do_something()

6. Tiếp theo, bạn đặt
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03 của
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

16 thành
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

20, mà bạn sẽ sử dụng khi gọi cho
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

06. Khi bạn chạy thử nghiệm của mình, bạn sẽ thấy rằng
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

16 chuyển tiếp các đối số của nó tới
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

20, sau đó chấp nhận giá trị trả về và cũng trả về giá trị đó

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

7

Tuyệt vời. Các câu lệnh

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

21 đã ghi lại các giá trị chính xác. Ngoài ra,
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

06 đã trả lại từ điển ngày lễ

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03 cũng có thể là một iterable. Có thể lặp lại phải bao gồm các giá trị trả về, ngoại lệ hoặc hỗn hợp của cả hai. Iterable sẽ tạo ra giá trị tiếp theo của nó mỗi khi bạn gọi phương thức giả lập của mình. Ví dụ: bạn có thể kiểm tra thử lại sau khi
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

32 trả về phản hồi thành công

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

8

Lần đầu tiên bạn gọi cho

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

06,
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

16 sẽ tăng
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

32. Lần thứ hai, phương thức trả về một từ điển ngày lễ hợp lệ. Những tác dụng phụ này khớp với thứ tự chúng xuất hiện trong danh sách được chuyển đến
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03

Bạn có thể đặt trực tiếp

from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
0 và
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03 trên
>>> mock.some_attribute

>>> mock.do_something()

6. Tuy nhiên, vì một đối tượng mô phỏng Python cần linh hoạt trong việc tạo các thuộc tính của nó, nên có một cách tốt hơn để định cấu hình các cài đặt này và các cài đặt khác

Loại bỏ các quảng cáo

Cấu hình Mock của bạn

Bạn có thể định cấu hình

>>> mock.some_attribute

>>> mock.do_something()

6 để thiết lập một số hành vi của đối tượng. Một số thành viên có thể định cấu hình bao gồm
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03,
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
0 và
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

43. Bạn cấu hình một
>>> mock.some_attribute

>>> mock.do_something()

6 khi bạn một hoặc khi bạn sử dụng

Bạn có thể định cấu hình một

>>> mock.some_attribute

>>> mock.do_something()

6 bằng cách chỉ định các thuộc tính nhất định khi bạn khởi tạo một đối tượng

>>>

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

9

Mặc dù

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03 và
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
0 có thể được đặt trên chính phiên bản
>>> mock.some_attribute

>>> mock.do_something()

6, nhưng các thuộc tính khác như
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

43 chỉ có thể được đặt thông qua
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

51 hoặc
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

45. Nếu bạn cố gắng đặt
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

43 của
>>> mock.some_attribute

>>> mock.do_something()

6 trên ví dụ, bạn sẽ nhận được một kết quả khác

>>>

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
0

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

43 là một thuộc tính chung cho các đối tượng sử dụng. Vì vậy,
>>> mock.some_attribute

>>> mock.do_something()

6 không cho phép bạn đặt giá trị đó trên phiên bản giống như cách bạn có thể làm với
from datetime import datetime

def is_weekday():
    today = datetime.today()
    # Python's datetime library treats Monday as 0 and Sunday as 6
    return (0 <= today.weekday() < 5)

# Test if today is a weekday
assert is_weekday()
0 hoặc
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03. Nếu bạn truy cập
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

59, bạn sẽ tạo thuộc tính
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

43 thay vì định cấu hình mô phỏng của mình

Bạn có thể định cấu hình một

>>> mock.some_attribute

>>> mock.do_something()

6 hiện có bằng cách sử dụng
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

45

>>>

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
1

Bằng cách giải nén từ điển thành

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

45 hoặc
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

64, bạn thậm chí có thể định cấu hình các thuộc tính của đối tượng mô phỏng Python của mình. Sử dụng cấu hình
>>> mock.some_attribute

>>> mock.do_something()

6, bạn có thể đơn giản hóa một ví dụ trước đó

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
2

Bây giờ, bạn có thể tạo và cấu hình các đối tượng mô phỏng Python. Bạn cũng có thể sử dụng mô phỏng để kiểm soát hành vi của ứng dụng của mình. Cho đến nay, bạn đã sử dụng các mô hình giả làm đối số cho các hàm hoặc các đối tượng vá lỗi trong cùng một mô-đun với các thử nghiệm của mình

Tiếp theo, bạn sẽ học cách thay thế mô hình giả của mình bằng các đối tượng thực trong các mô-đun khác

>>> mock.some_attribute >>> mock.do_something() 7

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp một cơ chế mạnh mẽ để mô phỏng các đối tượng, được gọi là , tìm kiếm một đối tượng trong một mô-đun nhất định và thay thế đối tượng đó bằng một
>>> mock.some_attribute

>>> mock.do_something()

6

Thông thường, bạn sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 làm công cụ trang trí hoặc trình quản lý bối cảnh để cung cấp phạm vi mà bạn sẽ mô phỏng đối tượng mục tiêu

>>> mock.some_attribute >>> mock.do_something() 7 với tư cách là Người trang trí

Nếu bạn muốn mô phỏng một đối tượng trong toàn bộ chức năng thử nghiệm của mình, bạn có thể sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 làm công cụ trang trí chức năng

Để xem điều này hoạt động như thế nào, hãy sắp xếp lại tệp

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4 của bạn bằng cách đặt logic và kiểm tra vào các tệp riêng biệt

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
3

Các chức năng này hiện nằm trong tệp riêng của chúng, tách biệt với các thử nghiệm của chúng. Tiếp theo, bạn sẽ tạo lại các bài kiểm tra của mình trong một tệp có tên là

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

74

Cho đến thời điểm này, bạn đã vá các đối tượng trong tệp mà chúng tồn tại. Bản vá khỉ là việc thay thế một đối tượng bằng một đối tượng khác trong thời gian chạy. Bây giờ, bạn sẽ sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 để thay thế đối tượng của mình trong
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
4

Ban đầu, bạn đã tạo một

>>> mock.some_attribute

>>> mock.do_something()

6 và vá
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

78 trong phạm vi cục bộ. Bây giờ, bạn cần truy cập thư viện
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

78 trong
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4 từ
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

74

Trong trường hợp này, bạn đã sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 làm công cụ trang trí và chuyển đường dẫn của đối tượng mục tiêu. Đường dẫn đích là
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

83 bao gồm tên mô-đun và đối tượng

Bạn cũng đã xác định một tham số mới cho chức năng kiểm tra.

>>> mock.some_attribute

>>> mock.do_something()

7 sử dụng tham số này để chuyển đối tượng giả định vào bài kiểm tra của bạn. Từ đó, bạn có thể sửa đổi mô phỏng hoặc đưa ra các xác nhận khi cần thiết

Bạn có thể thực hiện mô-đun thử nghiệm này để đảm bảo mô-đun hoạt động như mong đợi

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
5

Chi tiết kỹ thuật.

>>> mock.some_attribute

>>> mock.do_something()

7 trả về một thể hiện của , là lớp con của
>>> mock.some_attribute

>>> mock.do_something()

6.
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

86 rất hữu ích vì nó triển khai hầu hết các phương pháp kỳ diệu cho bạn, chẳng hạn như
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

89,
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

90 và
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

91, với các giá trị mặc định hợp lý

Sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 làm trang trí hoạt động tốt trong ví dụ này. Trong một số trường hợp, nó dễ đọc hơn, hiệu quả hơn hoặc dễ sử dụng hơn
>>> mock.some_attribute

>>> mock.do_something()

7 với tư cách là người quản lý ngữ cảnh

Loại bỏ các quảng cáo

>>> mock.some_attribute >>> mock.do_something() 7 với tư cách là Người quản lý bối cảnh

Đôi khi, bạn sẽ muốn sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 làm trình quản lý ngữ cảnh hơn là trình trang trí. Một số lý do tại sao bạn có thể thích trình quản lý bối cảnh bao gồm những điều sau đây

  • Bạn chỉ muốn giả định một đối tượng cho một phần của phạm vi thử nghiệm
  • Bạn đã sử dụng quá nhiều trình trang trí hoặc tham số, điều này làm ảnh hưởng đến khả năng đọc bài kiểm tra của bạn

Để sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 làm trình quản lý ngữ cảnh, bạn sử dụng câu lệnh
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

97 của Python

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
6

Khi bài kiểm tra thoát khỏi câu lệnh

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

97,
>>> mock.some_attribute

>>> mock.do_something()

7 sẽ thay thế đối tượng giả định bằng đối tượng ban đầu

Cho đến bây giờ, bạn đã chế nhạo toàn bộ đối tượng, nhưng đôi khi bạn sẽ chỉ muốn chế nhạo một phần của đối tượng

Vá các thuộc tính của đối tượng

Giả sử bạn chỉ muốn chế nhạo một phương thức của một đối tượng thay vì toàn bộ đối tượng. Bạn có thể làm như vậy bằng cách sử dụng

Ví dụ:

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
01 thực sự chỉ cần chế nhạo
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
02 và đặt
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

03 của nó thành
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

32

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
7

Trong ví dụ này, bạn chỉ chế nhạo

>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

16 chứ không phải tất cả
>>> from unittest.mock import Mock
>>> mock = Mock()
>>> mock

78. Mọi thuộc tính khác vẫn giữ nguyên

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
07 có các tham số cấu hình giống như
>>> mock.some_attribute

>>> mock.do_something()

7. Nhưng thay vì chuyển đường dẫn của mục tiêu, bạn cung cấp chính đối tượng mục tiêu làm tham số đầu tiên. Tham số thứ hai là thuộc tính của đối tượng đích mà bạn đang cố mô phỏng. Bạn cũng có thể sử dụng
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
07 làm trình quản lý bối cảnh như
>>> mock.some_attribute

>>> mock.do_something()

7

Đọc thêm. Bên cạnh các đối tượng và thuộc tính, bạn cũng có thể

>>> mock.some_attribute

>>> mock.do_something()

7 từ điển với

Học cách sử dụng

>>> mock.some_attribute

>>> mock.do_something()

7 là rất quan trọng để mô phỏng các đối tượng trong các mô-đun khác. Tuy nhiên, đôi khi không rõ đường dẫn của đối tượng mục tiêu là gì

Vá ở đâu

Biết nơi để nói với

>>> mock.some_attribute

>>> mock.do_something()

7 để tìm kiếm đối tượng mà bạn muốn chế nhạo là rất quan trọng vì nếu bạn chọn sai vị trí mục tiêu, kết quả của
>>> mock.some_attribute

>>> mock.do_something()

7 có thể là điều bạn không mong đợi

Giả sử bạn đang chế nhạo

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
5 trong
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4 bằng cách sử dụng
>>> mock.some_attribute

>>> mock.do_something()

7

>>>

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
8

Trước tiên, bạn nhập

>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
4. Sau đó, bạn vá
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
5, thay thế nó bằng một
>>> mock.some_attribute

>>> mock.do_something()

6. Tuyệt vời. Điều này đang làm việc như mong đợi

Bây giờ, hãy thay đổi ví dụ này một chút và nhập hàm trực tiếp

>>>

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
9

Ghi chú. Tùy thuộc vào ngày bạn đọc hướng dẫn này, đầu ra trên bảng điều khiển của bạn có thể là

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
22 hoặc
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
23. Điều quan trọng là đầu ra không phải là
>>> mock.some_attribute

>>> mock.do_something()

6 như trước đây

Lưu ý rằng mặc dù vị trí mục tiêu mà bạn đã chuyển đến

>>> mock.some_attribute

>>> mock.do_something()

7 không thay đổi, nhưng kết quả của việc gọi
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
5 lại khác. Sự khác biệt là do bạn đã thay đổi cách nhập chức năng

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
27 liên kết hàm thực với phạm vi cục bộ. Vì vậy, mặc dù bạn
>>> mock.some_attribute

>>> mock.do_something()

7 hàm sau đó, nhưng bạn bỏ qua mô phỏng vì bạn đã có một tham chiếu cục bộ đến hàm chưa được mô phỏng

A là để

>>> mock.some_attribute

>>> mock.do_something()

7 đối tượng mà nó được tra cứu

Trong ví dụ đầu tiên, chế nhạo

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
30 hoạt động vì bạn tra cứu hàm trong mô-đun
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
31. Trong ví dụ thứ hai, bạn có một tham chiếu cục bộ tới
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
5. Vì bạn sử dụng chức năng được tìm thấy trong phạm vi cục bộ, bạn nên thử chức năng cục bộ

>>>

>>> mock.some_attribute

>>> mock.do_something()

0

Bây giờ, bạn đã nắm chắc sức mạnh của

>>> mock.some_attribute

>>> mock.do_something()

7. Bạn đã biết cách
>>> mock.some_attribute

>>> mock.do_something()

7 đối tượng và thuộc tính cũng như nơi vá chúng

Tiếp theo, bạn sẽ thấy một số vấn đề phổ biến cố hữu trong chế độ mô phỏng đối tượng và các giải pháp mà

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp

Loại bỏ các quảng cáo

Các vấn đề chế nhạo thường gặp

Các đối tượng chế nhạo có thể gây ra một số vấn đề trong các bài kiểm tra của bạn. Một số vấn đề cố hữu trong chế giễu trong khi những vấn đề khác chỉ dành riêng cho

>>> mock.some_attribute

>>> mock.do_something()

5. Hãy nhớ rằng có những vấn đề khác với chế nhạo không được đề cập trong hướng dẫn này

Những cái được đề cập ở đây giống nhau ở chỗ vấn đề mà chúng gây ra về cơ bản là giống nhau. Trong mỗi trường hợp, các xác nhận kiểm tra là không liên quan. Mặc dù ý định của mỗi giả là hợp lệ, nhưng bản thân các giả không phải là

Thay đổi đối với giao diện đối tượng và lỗi chính tả

Các lớp và định nghĩa hàm luôn thay đổi. Khi giao diện của một đối tượng thay đổi, bất kỳ thử nghiệm nào dựa trên

>>> mock.some_attribute

>>> mock.do_something()

6 của đối tượng đó có thể trở nên không liên quan

Ví dụ: bạn đổi tên một phương thức nhưng quên rằng một bài kiểm tra sẽ mô phỏng phương thức đó và gọi ____26_______38. Sau khi thay đổi,

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
38 vẫn là
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
22. Tuy nhiên, xác nhận không hữu ích vì phương thức không còn tồn tại

Các bài kiểm tra không liên quan nghe có vẻ không quan trọng, nhưng nếu chúng là bài kiểm tra duy nhất của bạn và bạn cho rằng chúng hoạt động bình thường, tình huống có thể là thảm họa cho ứng dụng của bạn

Một vấn đề cụ thể đối với

>>> mock.some_attribute

>>> mock.do_something()

6 là lỗi chính tả có thể làm hỏng bài kiểm tra. Nhớ lại rằng một
>>> mock.some_attribute

>>> mock.do_something()

6 tạo giao diện của nó khi bạn truy cập các thành viên của nó. Vì vậy, bạn sẽ vô tình tạo ra một thuộc tính mới nếu viết sai tên của nó

Nếu bạn gọi

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
43 thay vì
>>> json = Mock()
>>> json.loads(s='{"key": "value"}')
>>> json.loads.assert_called_with('{"key": "value"}')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 814, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: Expected call: loads('{"key": "value"}')
Actual call: loads(s='{"key": "value"}')
>>> json.loads.assert_called_with(s='{"key": "value"}')
6, bài kiểm tra của bạn sẽ không tăng
>>> from unittest.mock import Mock

>>> # Create a mock object
.. json = Mock()
>>> json.loads('{"key": "value"}')


>>> # Number of times you called loads():
.. json.loads.call_count
1
>>> # The last loads() call:
.. json.loads.call_args
call('{"key": "value"}')
>>> # List of loads() calls:
.. json.loads.call_args_list
[call('{"key": "value"}')]
>>> # List of calls to json's methods (recursively):
.. json.method_calls
[call.loads('{"key": "value"}')]
1. Điều này là do bạn đã tạo một phương thức mới trên đối tượng mô phỏng Python có tên là
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
43 thay vì đánh giá một xác nhận thực tế

Chi tiết kỹ thuật. Thật thú vị,

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
47 là một lỗi chính tả đặc biệt của
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
48. Nếu bạn cố gắng truy cập một thuộc tính bắt đầu bằng
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
47 (hoặc
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
48), thì ____0_______6 sẽ tự động tăng ____26_______52

Những sự cố này xảy ra khi bạn mô phỏng các đối tượng trong cơ sở mã của riêng bạn. Một vấn đề khác phát sinh khi bạn mô phỏng các đối tượng tương tác với các cơ sở mã bên ngoài

Thay đổi phụ thuộc bên ngoài

Hãy tưởng tượng lại rằng mã của bạn yêu cầu một API bên ngoài. Trong trường hợp này, phụ thuộc bên ngoài là API dễ bị thay đổi mà không cần sự đồng ý của bạn

Một mặt, kiểm tra đơn vị kiểm tra các thành phần riêng biệt của mã. Vì vậy, việc mô phỏng mã thực hiện yêu cầu giúp bạn kiểm tra các thành phần biệt lập của mình trong các điều kiện được kiểm soát. Tuy nhiên, nó cũng thể hiện một vấn đề tiềm ẩn

Nếu một phụ thuộc bên ngoài thay đổi giao diện của nó, các đối tượng mô phỏng Python của bạn sẽ trở nên không hợp lệ. Nếu điều này xảy ra (và thay đổi giao diện là một sự cố), các thử nghiệm của bạn sẽ vượt qua vì các đối tượng giả của bạn đã che dấu thay đổi, nhưng mã sản xuất của bạn sẽ không thành công

Thật không may, đây không phải là vấn đề mà

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp giải pháp cho. Bạn phải thực hiện phán đoán khi chế giễu các phụ thuộc bên ngoài

Cả ba vấn đề này có thể gây ra sự không phù hợp của thử nghiệm và các vấn đề có khả năng gây tốn kém vì chúng đe dọa đến tính toàn vẹn của mô phỏng của bạn.

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp cho bạn một số công cụ để giải quyết những vấn đề này

Tránh các vấn đề thường gặp khi sử dụng thông số kỹ thuật

Như đã đề cập trước đây, nếu bạn thay đổi định nghĩa lớp hoặc hàm hoặc bạn viết sai chính tả thuộc tính của đối tượng mô phỏng Python, bạn có thể gây ra sự cố với các bài kiểm tra của mình

Những sự cố này xảy ra vì

>>> mock.some_attribute

>>> mock.do_something()

6 tạo các thuộc tính và phương thức khi bạn truy cập chúng. Câu trả lời cho những vấn đề này là ngăn
>>> mock.some_attribute

>>> mock.do_something()

6 tạo các thuộc tính không phù hợp với đối tượng mà bạn đang cố gắng mô phỏng

Khi định cấu hình

>>> mock.some_attribute

>>> mock.do_something()

6, bạn có thể chuyển đặc tả đối tượng cho tham số
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
58. Tham số
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
58 chấp nhận danh sách tên hoặc đối tượng khác và xác định giao diện của giả. Nếu bạn cố gắng truy cập một thuộc tính không thuộc thông số kỹ thuật,
>>> mock.some_attribute

>>> mock.do_something()

6 sẽ tăng
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
52

>>>

>>> mock.some_attribute

>>> mock.do_something()

1

Ở đây, bạn đã xác định rằng

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
62 có các phương thức được gọi là
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
63 và
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
64. Khi bạn truy cập vào
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
63, nó sẽ trả về một
>>> mock.some_attribute

>>> mock.do_something()

6. Khi bạn truy cập vào
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
67, một phương pháp không phù hợp với thông số kỹ thuật, thì
>>> mock.some_attribute

>>> mock.do_something()

6 sẽ tạo ra một
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
52

Thông số kỹ thuật hoạt động theo cách tương tự nếu bạn định cấu hình

>>> mock.some_attribute

>>> mock.do_something()

6 bằng một đối tượng

>>>

>>> mock.some_attribute

>>> mock.do_something()

2

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
63 khả dụng với
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
62 vì bạn đã định cấu hình
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
62 để khớp với giao diện của mô-đun
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
31

Hơn nữa,

>>> mock.some_attribute

>>> mock.do_something()

5 cung cấp các phương thức thuận tiện để tự động chỉ định giao diện của cá thể
>>> mock.some_attribute

>>> mock.do_something()

6

Một cách để triển khai thông số kỹ thuật tự động là

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
77

>>>

>>> mock.some_attribute

>>> mock.do_something()

3

Giống như trước đây,

# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
62 là một phiên bản
>>> mock.some_attribute

>>> mock.do_something()

6 có giao diện khớp với
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
31. Nếu bạn đang sử dụng
>>> mock.some_attribute

>>> mock.do_something()

7, bạn có thể gửi đối số tới tham số
# Pass mock as an argument to do_something()
do_something(mock)

# Patch the json library
json = mock
82 để đạt được kết quả tương tự

>>>

>>> mock.some_attribute

>>> mock.do_something()

4

Loại bỏ các quảng cáo

Phần kết luận

Bạn đã học được rất nhiều về cách chế nhạo đối tượng bằng cách sử dụng

>>> mock.some_attribute

>>> mock.do_something()

5

Bây giờ, bạn có thể

  • Sử dụng
    >>> mock.some_attribute
    
    >>> mock.do_something()
    
    
    6 để bắt chước đồ vật trong bài kiểm tra của bạn
  • Kiểm tra dữ liệu sử dụng để hiểu cách bạn sử dụng các đối tượng của mình
  • Tùy chỉnh các giá trị trả về và tác dụng phụ của các đối tượng giả của bạn
  • >>> mock.some_attribute
    
    >>> mock.do_something()
    
    
    7 đối tượng xuyên suốt codebase của bạn
  • Xem và tránh các sự cố khi sử dụng đối tượng mô phỏng Python

Bạn đã xây dựng một nền tảng hiểu biết sẽ giúp bạn xây dựng các bài kiểm tra tốt hơn. Bạn có thể sử dụng mô phỏng để hiểu rõ hơn về mã của mình mà bạn không thể có được bằng cách khác

Tôi để lại cho bạn một tuyên bố từ chối trách nhiệm cuối cùng. Cẩn thận với việc lạm dụng các đối tượng giả

Thật dễ dàng để tận dụng sức mạnh của các đối tượng giả Python và giả nhiều đến mức bạn thực sự làm giảm giá trị của các bài kiểm tra của mình

Nếu bạn muốn tìm hiểu thêm về

>>> mock.some_attribute

>>> mock.do_something()

5, tôi khuyên bạn nên đọc tài liệu tuyệt vời của nó

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Cải thiện các bài kiểm tra của bạn với Thư viện đối tượng mô phỏng Python

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Cuộc gọi hàm tạo mô phỏng Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Alex Ronquillo

Cuộc gọi hàm tạo mô phỏng Python
Cuộc gọi hàm tạo mô phỏng Python

Alex Ronquillo là Kỹ sư phần mềm tại thelab. Anh ấy là một Pythonista cuồng nhiệt, cũng đam mê viết lách và phát triển trò chơi

» Thông tin thêm về Alex


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Cuộc gọi hàm tạo mô phỏng Python

Aldren

Cuộc gọi hàm tạo mô phỏng Python

David

Cuộc gọi hàm tạo mô phỏng Python

Joanna

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Bạn có thể tạo mô hình giả bằng cách gọi một trong các hàm tạo của nó không?

Điều này không thể , theo như tôi biết, nhưng bạn có thể chỉ cần thêm một Trình xây dựng đơn giản hơn vào lớp của mình và sử dụng nó để kiểm tra.

Một hàm tạo có thể bị chế giễu không?

0, giờ đây chúng ta có thể giả lập các hàm tạo Java bằng Mockito . Điều này cho phép chúng tôi trả về một mô hình giả từ mọi cấu trúc đối tượng cho mục đích thử nghiệm. Tương tự như việc mô phỏng các cuộc gọi phương thức tĩnh với Mockito, chúng ta có thể xác định phạm vi thời điểm trả về một mô phỏng từ một hàm tạo Java cho một lớp Java cụ thể.

Chúng ta có thể thử một lớp bằng Python không?

đơn vị nhất. 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. đơ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ử một biến trong Python không?

Với biến mô-đun, bạn có thể đặt giá trị trực tiếp hoặc sử dụng mô hình .