Pytest-django: Use fixtures no Django TestCase

Criado em 4 jan. 2018  ·  7Comentários  ·  Fonte: pytest-dev/pytest-django

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?

Comentários muito úteis

@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.

Todos 7 comentários

@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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

koxu1996 picture koxu1996  ·  3Comentários

asfaltboy picture asfaltboy  ·  5Comentários

clintonb picture clintonb  ·  4Comentários

dan-passaro picture dan-passaro  ·  4Comentários

mjk4 picture mjk4  ·  4Comentários