mock.patch 和 unittest.skip 之间的冲突
Conflict between mock.patch and unittest.skip
(Python 3.4.0)
我遇到了这个奇怪的错误,我花了一些时间来调试:
user.py
class User:
def __init__(self, name):
self.name = name
def new_user(name):
user = User(name)
test.py
import unittest
from unittest.mock import Mock, patch
from user import new_user
@patch('user.User')
class TestUser(unittest.TestCase):
@unittest.skip
def test_new_user(self, mockUser):
new_user('Frank')
mockUser.assert_called_once_with('Frank')
unittest.main()
运行 会崩溃:
» python test.py
E
======================================================================
ERROR: test_new_user (__main__.TestUser)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/mock.py", line 1125, in patched
return func(*args, **keywargs)
TypeError: decorator() takes 1 positional argument but 2 were given
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
删除 skip 将使其 运行 正常。似乎 patch
和 skip
不能很好地叠加。这是正确的,还是我在做一些愚蠢的事情?
unittest.skip
需要自己的字符串参数,这是跳过测试的原因。
@unittest.skip("Not yet ready to test")
def test_new_user(self, mockUser):
new_user('Frank')
mockUser.assert_called_once_with('Frank')
您看到的交互来自 skip
装饰器,它使用方法本身作为 reason
参数 (def skip(reason):
),这导致 test_new_user
被绑定到在装饰器中定义的单参数函数,而不是您在测试用例中定义的双参数函数。
请注意,如果您保留对 skip
的调用并注释掉 patch
,您的测试仍然会通过,尽管 test_new_user
似乎没有收到它的 [=21] =] 参数。
unittest.skip
本身在技术上不是装饰器;它是一个 returns 装饰器的函数,然后将其应用于 test_new_user
。使用常规函数调用语法,您的代码可以
def test_new_user(self, mockUser):
...
test_new_user = unittest.skip(test_new_user)
当你需要的是
test_new_user = unittest.skip("my reason")(test_new_user)
您的 test_new_user
绑定到装饰器本身,而不是装饰方法。
(Python 3.4.0)
我遇到了这个奇怪的错误,我花了一些时间来调试:
user.py
class User:
def __init__(self, name):
self.name = name
def new_user(name):
user = User(name)
test.py
import unittest
from unittest.mock import Mock, patch
from user import new_user
@patch('user.User')
class TestUser(unittest.TestCase):
@unittest.skip
def test_new_user(self, mockUser):
new_user('Frank')
mockUser.assert_called_once_with('Frank')
unittest.main()
运行 会崩溃:
» python test.py
E
======================================================================
ERROR: test_new_user (__main__.TestUser)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/mock.py", line 1125, in patched
return func(*args, **keywargs)
TypeError: decorator() takes 1 positional argument but 2 were given
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
删除 skip 将使其 运行 正常。似乎 patch
和 skip
不能很好地叠加。这是正确的,还是我在做一些愚蠢的事情?
unittest.skip
需要自己的字符串参数,这是跳过测试的原因。
@unittest.skip("Not yet ready to test")
def test_new_user(self, mockUser):
new_user('Frank')
mockUser.assert_called_once_with('Frank')
您看到的交互来自 skip
装饰器,它使用方法本身作为 reason
参数 (def skip(reason):
),这导致 test_new_user
被绑定到在装饰器中定义的单参数函数,而不是您在测试用例中定义的双参数函数。
请注意,如果您保留对 skip
的调用并注释掉 patch
,您的测试仍然会通过,尽管 test_new_user
似乎没有收到它的 [=21] =] 参数。
unittest.skip
本身在技术上不是装饰器;它是一个 returns 装饰器的函数,然后将其应用于 test_new_user
。使用常规函数调用语法,您的代码可以
def test_new_user(self, mockUser):
...
test_new_user = unittest.skip(test_new_user)
当你需要的是
test_new_user = unittest.skip("my reason")(test_new_user)
您的 test_new_user
绑定到装饰器本身,而不是装饰方法。