Python 接收Django单元测试的True布尔值而不是False

Python 接收Django单元测试的True布尔值而不是False,python,django,unit-testing,Python,Django,Unit Testing,我正在为我的Django数据库进行一些单元测试,我不断得到一个True值,而不是我期望得到的False,因为该条目不在我的数据库中: import requests from django.test import TestCase from convoapp.models import InputInfo class InputInfoTestCase(TestCase): def setUp(self): #valid entry InputInfo.

我正在为我的Django数据库进行一些单元测试,我不断得到一个
True
值,而不是我期望得到的
False
,因为该条目不在我的数据库中:

import requests
from django.test import TestCase
from convoapp.models import InputInfo

class InputInfoTestCase(TestCase):
    def setUp(self):
        #valid entry
        InputInfo.objects.create(name="Skywalker", conversation_id='1', message_body='I am a Jedi, like my father before me')
        #invalid entry - missing 'name' field
        InputInfo.objects.create(conversation_id='4', message_body="No, I am your Father")
        #invalid entry - integer entered instead of string
        InputInfo.objects.create(name='Leia', conversation_id=3, message_body='You are a little short')

    def test_for_valid_entries(self):
        luke = InputInfo.objects.get(name='Skywalker')

        self.assertTrue(bool(luke), True)

    def test_for_invalid_entries(self):
        vader = InputInfo.objects.get(conversation_id='4')
        #invalid because of non-strong entry for conversation_id
        #leia = InputInfo.objects.get(name='Leia')

        self.assertFalse(bool(vader))
我得到一个错误:

Traceback (most recent call last):
  File "C:\Users\ELITEBOOK\documents\github\challenge\convoapp\tests.py", line 25, in test_for_invalid_entries
    self.assertFalse(bool(vader))
AssertionError: True is not false

为什么
vader
返回True?我假设这是因为
InputInfo.objects.create(对话\u id='4',message\u body=“否,我是您的父亲”)
,是因为临时创建了条目吗?因为在测试结束后,它不在我的数据库中

您正在创建一个id为4的对象,因此它返回true,并且作为它的测试数据库,因此在测试结束后您无法找到数据

如果你认为这是错误的话

试试下面的代码并检查

def test_for_invalid_entries(self):
        vader = InputInfo.objects.get(conversation_id=5)
        #invalid because of non-strong entry for conversation_id
        #leia = InputInfo.objects.get(name='Leia')

        self.assertFalse(bool(vader))

您正在创建一个id为4的对象,因此它返回true,并且作为它的测试数据库,因此在测试结束后您无法找到数据

如果你认为这是错误的话

试试下面的代码并检查

def test_for_invalid_entries(self):
        vader = InputInfo.objects.get(conversation_id=5)
        #invalid because of non-strong entry for conversation_id
        #leia = InputInfo.objects.get(name='Leia')

        self.assertFalse(bool(vader))

每次测试前都会调用设置函数,因此您的数据库中有
vader
条目(因为您请求
conversation\u id=4
,这是因为测试前调用了
setUp

也就是说,向布尔施压没有多大意义,如果您试图查看自己是否拥有该条目,您应该使用:

self.assertIsNone(vader)


通过这种方式,您可以准确地知道您正在测试什么

每次测试之前都会调用设置函数,因此您的数据库中有
vader
条目(因为您请求
conversation\u id=4
,该条目自测试之前调用
setUp
以来一直存在)

也就是说,向布尔施压没有多大意义,如果您试图查看自己是否拥有该条目,您应该使用:

self.assertIsNone(vader)


这样你就可以准确地知道你在测试什么了

你能解释一下为什么你认为你应该在这里得到一个错误吗?如果条目不在数据库中,
.get()
将引发DoesNotExist异常;没有,所以条目就在那里。是的,是的。测试有各自独立的数据库,除非您明确地“维护”它,否则每次运行测试时都会创建和销毁它。您能解释一下为什么您认为应该在这里得到一个False吗?如果条目不在数据库中,
.get()
将引发DoesNotExist异常;没有,所以条目就在那里。是的,是的。测试有各自独立的数据库,除非您显式地“维护”它,否则每次运行测试时都会创建和销毁它。好吧,我这么认为,好吧,所以我想向我的服务器发送一个POST请求,并测试是否添加了条目(不应该添加)。我使用Python请求将信息发送到服务器,但它只是发送到测试服务器,对吗?那么我是否需要从非测试代码中导入函数?如果这是有意义的,那么如果您的目标是构建单元测试,那么您就负担不起在自动化测试中发送POST请求。您应该做的是使用不同的参数集分别测试您的视图,以查看您的视图是否以应有的方式作出反应。为此,最好的方法是使用Mock来模拟参数/对象。你可以在这里找到医生:谢谢,我会查一下的。不过,快速问一下:为什么我付不起发送邮件请求的费用?这是我现在正在做的一个非常小的项目,我尝试在我的
setup()
方法中发送一个POST请求,但它似乎没有发布信息执行测试时您的Web服务器没有运行(或者至少不应该运行),因为测试应该在您控制的全新环境中执行(否则,您无法确定代码中是否存在问题),因此它无法接受POST请求。单元测试的原理是测试非常小的代码块,您无法100%控制POST请求(例如,如果您没有internet怎么办?)好吧,我想是的,好吧,我想向我的服务器发送一个POST请求,并测试是否添加了条目(不应该添加)。我使用Python请求将信息发送到服务器,但它只是发送到测试服务器,对吗?那么我是否需要从非测试代码中导入我的函数?如果这有意义,如果您的目标是构建单元测试,那么您就不能在自动测试中发送POST请求。您应该做的是单独测试您的视图h不同的参数集,以查看您的视图是否会做出应有的反应。为此,最好的方法是使用模拟来模拟参数/对象。您可以在此处找到文档:谢谢,我会查一下。快速问题:为什么我不能发送POST请求?我现在正在做一个非常小的项目,我尝试在中发送POST请求我的
setup()
方法,但它似乎不是在发布信息。在执行测试时,您的Web服务器没有运行(或者至少不应该运行),因为测试应该在您控制的全新环境中执行(否则您将无法确知代码中是否存在问题),所以它不能接受POST请求。单元测试的原理是测试非常小的代码块,你不能100%地控制POST请求(例如,如果你没有internet怎么办?)好的,我想是的,好的,所以我想向我的服务器发送一个POST请求,并测试是否添加了条目(不应该)。我使用Python请求将信息发送到服务器,但它只是发送到测试服务器,对吗?那么我需要从非测试代码导入我的函数吗?如果这有意义的话,好的,我想是的,好的,所以我想向我的服务器发送一个POST请求,并测试是否添加了条目(不应该).我正在使用Python请求将信息发送到服务器,但它只是发送到测试服务器,对吗?那么我需要从非测试代码导入我的函数吗?如果有意义的话,lol