单元 Django TestCase 上的断言错误
Assertion error on a unit Django TestCase
我在我的 webapp 中为我的 Question.save()
方法创建了一个单元测试,当我 运行 python manage.py test
我得到一个如下所述的断言错误?
这是我的部分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'...
将 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_called_once_with(
settings.ES_INDEX,
'doc', # Added
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,
}
)
我在我的 webapp 中为我的 Question.save()
方法创建了一个单元测试,当我 运行 python manage.py test
我得到一个如下所述的断言错误?
这是我的部分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'...
将 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_called_once_with(
settings.ES_INDEX,
'doc', # Added
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,
}
)