【问题标题】:mock attribute assertion failure模拟属性断言失败
【发布时间】:2020-11-01 19:30:29
【问题描述】:

我对 python 测试比较陌生。我正在使用unittest.mock 来测试 Django 视图功能。我在嘲笑一个模特。我正在使用 TDD,一旦视图层通过了所有测试,我将在模型中实现更改。

def new_list(request):
form = ItemForm(data=request.POST)
if form.is_valid():
    list_ = List()
    list_.owner = request.user
    print(list_.owner)
    list_.save()
    form.save(for_list=list_)
    return redirect(list_)
else:

    return render(request, 'home.html', {'form': form})

测试代码如下:

@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)

我得到的错误如下:

FAIL: test_list_owner_is_saved_if_user_is_authenticated (lists.tests.test_views.NewListTest)

Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/mock.py", 
line 1204, in patched
 return func(*args, **keywargs)
File "/Users/asim/python-projects/django-todo-list/superlists/lists/tests/test_views.py", 
line 181, in test_list_owner_is_saved_if_user_is_authenticated
 self.assertEqual(mock_list.owner, user)
 AssertionError: <MagicMock name='list().owner' id='140457579271392'> != <User: User object 
 (a@b.com)>

我认为 Magic mock 将返回任何断言 true。任何帮助和解释将不胜感激。

【问题讨论】:

    标签: python django unit-testing mocking


    【解决方案1】:

    我设法通过补丁装饰器解决了这个问题。目标路径错误。而不是lists.views.list,它应该是lists.views.List,因为这个错误List模型没有被模拟,因此失败了。解决这个问题解决了我的问题。

    @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
        mock_list.owner = user
        self.assertEqual(mock_list.owner, user)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多