Tôi muốn có thể trả về một giá trị từ một vật cố định cho nhiều bài kiểm tra/các lớp thử nghiệm, nhưng giá trị được chuyển qua là một hàm.fixture pytest luôn luôn trả về một chức năng
Dưới đây là mã của tôi:
import pytest
@pytest.fixture()
def user_setup():
user = {
'name': 'chad',
'id': 1
}
return user
@pytest.mark.usefixtures('user_setup')
class TestThings:
def test_user(self):
assert user_setup['name'] == 'chad'
Đầu ra là:
=================================== FAILURES ===================================
_____________________________ TestThings.test_user _____________________________
self = <tests.test_again.TestThings instance at 0x10aed6998>
def test_user(self):
> assert user_setup['name'] == 'chad'
E TypeError: 'function' object has no attribute '__getitem__'
tests/test_again.py:14: TypeError
=========================== 1 failed in 0.02 seconds ===========================
Nhưng nếu tôi viết lại thử nghiệm của tôi để nó không sử dụng usefixtures
trang trí, nó hoạt động như mong đợi:
def test_user(user_setup):
assert user_setup['name'] == 'chad'
Bất kỳ ý tưởng nào tại sao nó không hoạt động khi tôi cố gắng sử dụng phương pháp trang trí?
Cảm ơn bạn đã giải thích rõ về cách hoạt động của nó. Tôi đã nghĩ rằng tôi có thể thực hiện điều này mà không cần phải thêm đối số cho mỗi hàm thử nghiệm nằm trong lớp thử nghiệm của tôi. – Cass
Tôi chỉ đang tìm kiếm sự khác biệt và/hoặc trường hợp sử dụng cho hai biến thể này và khi nào sử dụng, nhờ lời giải thích này. – Zelphir
Theo các tài liệu chính thức, bạn không nên * có * để thêm 'user_setup' vào mỗi chức năng kiểm tra khi chúng được nhóm lại trong một lớp được trang trí bằng' @ pytest.mark.usefixtures': “Do điểm đánh dấu usefixtures, Cleandir fixture sẽ được yêu cầu cho việc thực hiện của mỗi phương pháp thử nghiệm, giống như khi bạn đã chỉ định một đối số hàm “cleandir” cho mỗi đối tượng. ”(Nguồn: http://pytest.org/latest/fixture.html#using-fixtures -from-classes-modules-or-projects) Sau khi tất cả, toàn bộ các điểm kiểm tra nhóm như thế này là để thao tác chúng như là một lô.) ... Có lẽ đây là một lỗi pytest? – Zearin