首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pytest-django依赖注入

Pytest-django依赖注入
EN

Stack Overflow用户
提问于 2019-07-19 08:58:12
回答 3查看 314关注 0票数 1

pytest是如何知道是用RequestFactory还是Client实例注入测试函数的?

代码语言:javascript
复制
def test_with_client(client):
    response = client.get('/')
    assert response.content == 'Foobar'


def test_details(rf):
    request = rf.get('/customer/details')
    response = my_view(request)
    assert response.status_code == 200

换句话说:如何确保输入夹具是某种类型的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-19 09:16:18

pytest不是根据类型而是根据名称注入的。输入参数的名称与注册的固定装置相匹配。

请参阅docs 这里,但简而言之

代码语言:javascript
复制
import pytest

@pytest.fixture
def connection():
    return Connection()

def test_my_object(connection):
    target = MyObject(connection)

    assert ...

您可以使用类型注释来帮助PyCharm等推断正确的类型,但是pytest没有使用这些类型。

票数 3
EN

Stack Overflow用户

发布于 2019-07-19 09:18:23

简短的回答:你不应该为每个测试运行这些检查。使用测试参数名称来确定注入哪些夹具是pytest的核心组件,对于每个夹具使用assert isinstance(my_fixture, MyFixtureType)的每个测试都是多余的。

pytest-django已经在测试clientrf固定装置的类型是否正确:

代码语言:javascript
复制
def test_client(client):
    assert isinstance(client, Client)
...
def test_rf(rf):
    assert isinstance(rf, RequestFactory)
票数 1
EN

Stack Overflow用户

发布于 2019-07-19 09:08:04

编辑:

由于您已将该夹具作为测试方法的param传递,如果您正确地获得了该夹具名称,则无需检查任何内容。

下面是一个例子:

代码语言:javascript
复制
@pytest.fixture(scope='session')                                                                                                                                                                            
def factory():                                                                                                                                                                                              
    return RequestFactory(HTTP_X_REQUESTED_WITH='XMLHttpRequest')                                                                                                                                        

@pytest.fixture(scope='session')                                                                                                                                                                            
def client():                                                                                                                                                                                               
    return Client(HTTP_X_REQUESTED_WITH='XMLHttpRequest')   

现在,在您的测试方法中,您可以使用其中一个或两个装置并与它们一起工作,例如:

代码语言:javascript
复制
def test_foo(client):
    # Do stuff     

def test_bar(factory):
    # Do stuff           

原始答案:

您可以使用isinstance检查输入夹具的类型。

代码语言:javascript
复制
from django.test import RequestFactory, Client

Client的测试方法测试中:

代码语言:javascript
复制
if isinstance(client, Client):
    # This is a Client instance

同样适用于RequestFactory

代码语言:javascript
复制
if instance(rf, RequestFactory):
    # This is a RequestFactory instance
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57108949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档