python - Mock() 函数在 django2 中给出 TypeError

标签 python django mocking tdd django-2.0

我正在关注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

traceback

可以是什么?

谢谢

最佳答案

终于在网上找到了解决办法。

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/

相关文章:

Python:无法分配给运算符

python - Python Testdome 的两次和测试 - 如何通过性能测试?

javascript - 我无法使用 jquery 使用 Handsontable 加载数据

java - 使用mockito测试带有条件循环的void方法

c# - 如何在 AspNetCore.Authentication.Abstractions 上模拟 AuthenticateAsync

python - 如何让 Python 脚本在退出时退出 shell?

python - batch_size = x.shape[0] AttributeError : 'tuple' object has no attribute 'shape'

python - Django 数据库到 postgresql

python - 如何在 django 中检查 BASE_DIR?

flutter - 如何模拟导航参数以测试 flutter 屏幕小部件?