Estou usando a classe Django TestCase para algumas das conveniências - carregamento de fixture, asserções especiais, etc - mas gostaria de usar alguns dos fixtures pytest, se possível. Eu posso usar @pytest.mark.usefixtures
mas isso não me dá acesso aos objetos retornados pelas luminárias, pelo que eu posso dizer. Por exemplo, se eu usar @pytest.mark.usefixtures("admin_client")
, o cliente admin gerado pelo aparelho não está disponível em nenhum lugar que eu possa encontrar.
Existe uma maneira de fazer isso que estou perdendo? Ou apenas algo que não é compatível?
Vejo na documentação do pytest que os fixtures podem ser escritos para dar suporte ao trabalho com classes TestCase no estilo de teste de unidade - https://docs.pytest.org/en/latest/unittest.html#mixing -pytest-fixtures-into-unittest-testcase -subclasses-using-marks; isso seria uma opção para luminárias pytest-django?
@rlskoeser Sim, usando a mesma estratégia para Python unittest.TestCase
que você usaria para django.test.TestCase
funciona. Você pode injetar as fixture (s) pytest na classe ou instância de teste, dependendo do que você precisa.
@gsong , desculpe, você está dizendo que isso funciona atualmente? Você poderia fornecer um exemplo de código mostrando como eu acessaria, por exemplo, admin_client
dentro de uma classe?
@rlskoeser Você já tentou algo como:
import pytest
class TestOrders:
def test_create_order(self, admin_client):
response = admin_client.get('/myurl')
assert response.status_code == 200
Não tenho certeza se é isso que você está procurando.
@rlskoeser Algo assim:
from django.test import TestCase
import pytest
from ..client import MagicClient
@pytest.mark.usefixtures("inject_attrs")
class TestGetSubjectId(TestCase):
def test_something(self):
result = self.admin_client.do_something()
assert result is True
@pytest.fixture(scope="class")
def inject_attrs(request, admin_client):
request.cls.admin_client = admin_client
@pytest.fixture
def admin_client():
return MagicClient()
Você pode injetar quantas luminárias pytest desejar na luminária inject_attrs
. Se você preferir anexar o acessório à instância TestCase
, apenas use request.instance
vez de request.cls
.
Deixe-me saber se isso não estiver claro.
@gsong Obrigado pelo seu trecho! Infelizmente, parece que os registros do banco de dados dos objetos criados nas luminárias não estão sendo apagados entre as chamadas, certo? Quer dizer, se eu tiver poucos test_...
métodos em minha classe, envolvidos com @pytest.mark.usefixtures
então o fixture é chamado para cada método de teste, mas o banco de dados não está sendo limpo.
UPD : isso porque os acessórios usados na decoração de uma classe devem ser definidos por meio de @pytest.fixture(scope="class")
, então está tudo bem.
veja também: # 13 "Carregamento fácil de acessórios"
Fechando conforme respondido.
Comentários muito úteis
@rlskoeser Algo assim:
Você pode injetar quantas luminárias pytest desejar na luminária
inject_attrs
. Se você preferir anexar o acessório à instânciaTestCase
, apenas userequest.instance
vez derequest.cls
.Deixe-me saber se isso não estiver claro.