Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单元Django测试用例上的断言错误_Python_Django Tests - Fatal编程技术网

Python 单元Django测试用例上的断言错误

Python 单元Django测试用例上的断言错误,python,django-tests,Python,Django Tests,我在我的webapp中为我的Question.save()方法创建了一个单元测试,当我运行python manage.py测试时,我得到一个断言错误,如下所述 这是我的test.py部分: def test_elasticsearch_upsert_on_save(self, ElasticsearchMock): user = get_user_model().objects.create_user( username = 'unittest',

我在我的webapp中为我的
Question.save()
方法创建了一个单元测试,当我运行
python manage.py测试时,我得到一个断言错误,如下所述

这是我的
test.py部分:

def test_elasticsearch_upsert_on_save(self, ElasticsearchMock):
        user = get_user_model().objects.create_user(
                username = 'unittest',
                password='unittest',
                )
        question_title = 'Unit test'
        question_body = 'some long text'
        q = Question(
                title=question_title,
                question=question_body,
                user=user,
                )
        q.save()

        self.assertIsNotNone(q.id)
        self.assertTrue(ElasticsearchMock.called)
        mock_client = ElasticsearchMock.return_value
        mock_client.update.assert_called_once_with(
            settings.ES_INDEX,
            id=q.id,

            body={
                'doc': {
                    '_type': 'doc',
                    'text':'{}\n{}'.format(question_title, question_body),
                    'question_body':question_body,
                    'title': question_title,
                    'id': q.id,
                    'created': q.created,
                },'doc_as_upsert': True,
            }
        )
models.py的一部分:

    def as_elasticsearch_dict(self):
        return {
        '_id': self.id,
        '_type': 'doc',
        'text': '{}\n{}'.format(self.title, self.question),
        'question_body': self.question,
        'title': self.title,
        'id': self.id,
        'created': self.created,
        }

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):


        super().save(force_insert=force_insert,
                    force_update=force_update,
                    using=using,
                    update_fields=update_fields)
        elasticsearch.upsert(self)
我希望测试能够通过,但出现以下错误:

FAIL: test_elasticsearch_upsert_on_save (qanda.tests.QuestionSaveTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\program files (x86)\python37-32\Lib\unittest\mock.py", line 1204, in patched
    return func(*args, **keywargs)
  File "C:\Users\tafapc1\answerly\django\qanda\tests.py", line 48, in test_elasticsearch_upsert_on_save
    },'doc_as_upsert': True,
  File "c:\program files (x86)\python37-32\Lib\unittest\mock.py", line 840, in assert_called_once_with
    return self.assert_called_with(*args, **kwargs)
  File "c:\program files (x86)\python37-32\Lib\unittest\mock.py", line 829, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: Expected call: update('answerly', body={'doc': {'_type': 'doc', 'text': 'Unit test\nsome long t
ext', 'question_body': 'some long text', 'title': 'Unit test', 'id': 1, 'created': datetime.datetime(2019, 9, 1
1, 19, 38, 37, 498420, tzinfo=<UTC>)}, 'doc_as_upsert': True}, id=1)
Actual call: update('answerly', 'doc', body={'doc': {'_type': 'doc', 'text': 'Unit test\nsome long text', 'ques
tion_body': 'some long text', 'title': 'Unit test', 'id': 1, 'created': datetime.datetime(2019, 9, 11, 19, 38,
37, 498420, tzinfo=<UTC>)}, 'doc_as_upsert': True}, id=1)

----------------------------------------------------------------------
Ran 1 test in 1.420s

FAILED (failures=1)
Destroying test database for alias 'default'...
FAIL:test\u elasticsearch\u upsert\u on\u save(qanda.tests.QuestionSaveTestCase)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“c:\program files(x86)\python37-32\Lib\unittest\mock.py”,第1204行,带补丁
返回函数(*参数,**键盘)
文件“C:\Users\tafapc1\answerly\django\qanda\tests.py”,第48行,在保存时插入测试
}“doc_as_upsert”:正确,
文件“c:\program files(x86)\python37-32\Lib\unittest\mock.py”,第840行,在assert\u中称为\u once\u
返回self.assert_调用_并带有(*args,**kwargs)
文件“c:\program files(x86)\python37-32\Lib\unittest\mock.py”,第829行,在断言\u中被称为\u
从原因引发断言错误(_error_message())
AssertionError:预期调用:update('answerly',body={'doc':{'u type':'doc','text':'单元测试\n一些长的
ext',question_body',some long text',title',Unit test',id':1',created':datetime.datetime(2019,9,1
1,19,38,37498420,tzinfo=)},“doc\u as\u upsert”:True},id=1)
实际调用:update('answerly','doc',body={'doc':{'u type':'doc','text':'unittest\n一些长文本','ques
正文“:”一些长文本“,”标题“:”单元测试“,”id“:1,“创建”:datetime.datetime(2019,9,11,19,38,
37498420,tzinfo=)},'doc\u as\u upsert':True},id=1)
----------------------------------------------------------------------
在1.420s内运行了1次测试
失败(失败=1)
正在销毁别名“default”的测试数据库。。。

doc
参数添加到模拟:

mock_client.update.assert_called_once_with(
            settings.ES_INDEX,
            id=q.id,
            doc='doc',
            body={
                'doc': {
                    '_type': 'doc',
                    'text':'{}\n{}'.format(question_title, question_body),
                    'question_body':question_body,
                    'title': question_title,
                    'id': q.id,
                    'created': q.created,
                },'doc_as_upsert': True,
            }
        )

如果您将预期调用和实际调用放在彼此下方,您可以看到它们实际上是不同的,因此测试失败是有道理的

expected=update('answerly',        body={'doc': {'_type': 'doc', 'text': 'Unit test\nsome long text', 'question_body': 'some long text', 'title': 'Unit test', 'id': 1, 'created': datetime.datetime(2019, 9, 11, 19, 38, 37, 498420, tzinfo=)}, 'doc_as_upsert': True}, id=1)

actual=  update('answerly', 'doc', body={'doc': {'_type': 'doc', 'text': 'Unit test\nsome long text', 'question_body': 'some long text', 'title': 'Unit test', 'id': 1, 'created': datetime.datetime(2019, 9, 11, 19, 38, 37, 498420, tzinfo=)}, 'doc_as_upsert': True}, id=1)
doc
作为第二个参数传递应该可以解决您的问题:

mock_client.update.assert_调用_once_(
设置.ES_索引,
“文件”,添加
id=q.id,
身体={
“医生”:{
“_type”:“doc”,
“文本”:“{}\n{}”。格式(问题标题,问题正文),
“问题体”:问题体,
“标题”:问题的标题,
“id”:q.id,
“创建”:q.created,
}“doc_as_upsert”:正确,
}
)

这不起作用,因为在实际调用中,
'doc'
没有作为关键字参数传递
'doc'
应该作为
设置之后的第二个参数传递。ES_INDEX
@Bob,我尝试了@2ps告诉我的内容,但它给出了相同的错误。用
'doc'
替换
doc='doc'
也会返回语法错误:它不是
(settings.ES_INDEX,id=q.id,doc='doc',…)
,而是
(settings.ES_INDEX,'doc',id=q.id,…)
,不应该返回语法错误。确切地说,但是我在
settings.ES_INDEX
之后放了一个
'doc'
参数,它不起作用。断言错误:
预期调用:update('answerly','doc',body={'doc':{'doc':'doc','text':'unittest\n一些长文本','question\u body':'some long text','title','Unit test','id':1,'created':datetime.datetime(2019,9,11,20,28,43112222,tzinfo=),'doc_as_upsert':True},id=1)
实际调用:update('answerly','doc',body={'doc':{'text':'unittest\n一些长文本','som long text','title':'unittest','id','1','created':datetime.datetime(2019,9,11,20,28,43,112222,tzin-fo=},'doc as-u as-up'True,id=1)
实际调用中现在似乎缺少了
“u type”:“doc”
。此外,预期的问题正文是
一些长文本,而实际的是
一些长文本。不确定您是否意外地在那里添加了空格。可能我遗漏了一些内容。这是elasticsearch.py
def upser中的upsert函数t(问题\模型):客户机=获取\客户机()问题\目录=问题\模型。as弹性搜索\目录()文档\类型=问题\目录[''']删除问题\目录[''']删除问题\目录[''']响应=客户机。更新(settings.ES\索引,文档\类型,id=问题\模型.id,正文={'doc':问题\目录,'doc \目录['upsert':True,})返回响应
现在,当我删除
elasticsearch.py模块中的
del-question\u-dict[''u-type']
时,测试通过了。因此您的解决方案在@Bob中起了作用