python - 登录或匿名用户的 django 单元测试

标签 python django unit-testing

我有一个服务,它实际上返回一个字典,具体取决于用户是否登录、匿名或通过电子邮件匿名。我在 django Rest api 中使用了该服务,并将所有逻辑放在 api View 中。 现在我想为此 api 创建一个单元测试,并想测试以下不同的情况,即

  1. 如果用户已登录
  2. 如果用户是匿名且没有电子邮件
  3. 如果用户通过电子邮件匿名

即,

对于1,如果用户登录,我们将有一个不同的值, 对于2,如果用户是匿名的,我们将有另一个不同的值, 对于3,如果用户是匿名但提供电子邮件,我们将有另一个不同的值

现在在 django 单元测试中,我如何检查这种不同的情况?

为了更方便,我正在分享我实际尝试过的内容(实际上效果并不完美)

def test_requirement_header_create_api(self, mocked_get_or_save_anonymous_user_email):
    mocked_get_or_save_anonymous_user_email.return_value = dict()
    client = APIClient(enforce_csrf_checks=True)
    logged_in = client.login(username=self.user.email, password=self.user.password)

    if logged_in:
        self.data = {
            "user_id": self.user_id,
            "description": self.description,
        }
        expected_return = {
            "user_id": self.user_id,
            "description": self.description,
        }
    elif self.anonymous_user:
        self.data = {
            "email": self.anonymous_user.email,
            "anonymous_user_email_id": self.anonymous_user.id,
            "description": self.description,
        }
        expected_return = {
            "id": 2,
            "status": self.requirement_status,
            "description": self.description,
        }
    else:
        self.data = {
            "description": self.description,
            "session": self.session,
        }
        expected_return = {
            "description": self.description,
            "session": self.session,
        }
    response = client.post('/api/requirement-header/', self.data, format='json')
    self.assertDictEqual(response.data, expected_return)

我只是想知道**如何在 django 单元测试中检查此类情况

if user is logged in then test something.....
elif user is anonymous then test some another thing..... 

事实上,请不要关心我的共享代码,我需要知道的是如何检查我上面写的情况,我已经共享了我的代码,让你知道我有什么到目前为止实际上已经尝试过检查这些情况。但我很确定,这不是正确的方法,但很抱歉我找不到正确的方法。事实上,这可能是我缺乏在 djano 中编写 api 测试的原因我是第一次写文章。

最佳答案

要检查匿名用户,您可以使用(如 the docs 中所示)

self.user.is_anonymous()

要检查登录用户,您可以使用(同样,taken from the docs

self.user.is_authenticated()

话虽如此,这些应该是单独的单元测试。单元测试应该简单,只测试一件事。在一个单元测试中测试这些不同的情况是一种反模式。

关于python - 登录或匿名用户的 django 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37112548/

相关文章:

python - 在 Python 中将对象保存到 JSON 或 XML 文件中

python - Python中object的__hash__()和__eq__()的源代码是什么?

python - pytest assert_used_with 不适用于 Django 管理命令

python - Django - AttributeError _committed

Django 1.3 : Outbox empty during tests

python - 我如何从 __init__ 调用属性 setter

Python 单元测试。测试打印动态数据的方法

java - 如何在服务层单元测试中模拟数据库结果?

c++ - 在 g++ 下获取 stringstream >> my_double 以给出无限值或 NaN 的方法?

python - 为调度程序使用堆