我正在关注this tutorial .
当我运行test_views.py
时根据作者的说法,我有一个不应该出现的错误:TypeError: quote_from_bytes() expected bytes
.
我的views
和我的test_views
与书本相同,但我使用 django 2.0.6 而不是 django 1.11,所以我的 url.py
改变,所以也许这就是问题所在。
编辑:
再一看,问题似乎出在 mock()
中。功能。
当我使用patch('lists.views.List')
时Print(list_)
在我看来给出 <MagicMock name='List()' id='79765800'>
而不是List object (1)
/编辑
我的lists/urls.py
:
urlpatterns = [
path('new', views.new_list, name='new_list'),
path('<slug:list_id>/',
views.view_list, name='view_list'),
path('users/<email>/', # I'm not sure about this one but it works in other tests
views.my_lists, name='my_lists'),
]
#instead of:
#urlpatterns = [
# url(r'^new$', views.new_list, name='new_list'),
# url(r'^(\d+)/$', views.view_list, name='view_list'),
# url(r'^users/(.+)/$', views.my_lists, name='my_lists'),
#]
我的lists/views.py
:
[...]
def new_list(request):
form = ItemForm(data=request.POST)
if form.is_valid():
list_ = List()
list_.owner = request.user
list_.save()
form.save(for_list=list_)
Print(list_)
return redirect(list_)
else:
return render(request, 'home.html', {"form": form})
我的lists/tests/test_views.py
:
@patch('lists.views.List')
@patch('lists.views.ItemForm')
def test_list_owner_is_saved_if_user_is_authenticated(self,
mockItemFormClass, mockListClass
):
user = User.objects.create(email='a@b.com')
self.client.force_login(user)
self.client.post('/lists/new', data={'text': 'new item'})
mock_list = mockListClass.return_value
self.assertEqual(mock_list.owner, user)
我的完整回溯:
TypeError: quote_from_bytes() expected bytes
可以是什么?
谢谢
最佳答案
终于在网上找到了解决办法。
Django 2 doesn't support anymore bytestrings在某些地方,因此当 View 重定向模拟类列表时,它会作为模拟对象执行,并且 iri_to_uri
django 函数抛出错误。在 django 1.11 iri_to_uri
将 iri 强制为字节 return quote(force_bytes(iri), safe="/#%[]=:;$&()+,!?*@'~")
现在是 return quote(iri, safe="/#%[]=:;$&()+,!?*@'~")
。所以解决办法是return redirect(str(list_.get_absolute_url()))
而不是return redirect(list_)
在 lists.views.py
def new_list(request):
form = ItemForm(data=request.POST)
if form.is_valid():
list_ = List()
list_.owner = request.user
list_.save()
form.save(for_list=list_)
#return redirect(list_)
return redirect(str(list_.get_absolute_url()))
else:
return render(request, 'home.html', {"form": form})
我希望这对其他人有帮助
关于python - Mock() 函数在 django2 中给出 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50956160/