这是我的类(class):
# Production.py
import boto3
class Production(object):
resource = boto3.resource('dynamodb', 'us-west-2')
def __init__(self):
self.table = Production.resource.Table('employee')
我正在尝试测试该resource.Table是用arg“employee”调用的。我为它编写了一个单元测试
def test_init():
with patch('Production.boto3.resource') as resource:
mock_resource = MagicMock()
resource.return_value = mock_resource
pd = Production()
resource.assert_called_with('dynamodb', 'us-west-2')
table = resource.return_value.Table.return_value
table.assert_called_with('employee')
test_init()
但它似乎不起作用...有人可以帮助我如何测试这个吗?
最佳答案
当你修补一个对象时,它会为你模拟它的所有方法。所以(我没有测试代码,但是)我认为:
def test_resource_is_called_with_correct_params():
with patch('Production.boto3') as mock_boto:
Production()
mock_boto.resource.assert_called_once_with('dynamodb', 'us-west-2')
将完成测试的第一部分。然后,我将在另一个测试中单独测试 init 函数,这更清晰、更容易、更简单(通常旨在每个测试测试一件事):
def test_table_is_called_with_correct_params():
with patch('Production.boto3') as mock_boto:
Production()
mock_resource = mock_boto.resource.return_value
mock_resource.Table.assert_called_once_with('employee')
对此我想说几句话:
将您的测试分组到一个可以组织您的测试的类中是件好事。此外,当您获得 TestsCase 子类时,您会获得一系列附带的方法,例如 self.assertDictEqual ,它将提供良好的有意义的输出,并且可以很好地测试像nose2这样的运行程序。因此,请执行以下操作:
class TestProduction(unittest.TestCase): def test1(): pass def test2(): pass
您正在测试的内容基本上是硬编码的,因此这些测试并没有真正的意义。您只是在测试该语言是否有效。我会学习测试行为而不是实现......那么你希望你的类(class)做什么?在写类(class)之前先坐下来思考一下。然后,您可以在开始编码之前写出规范并使用这些规范来设计测试。
关于python-3.x - 修补 boto3.resource 和 resource.Table 方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46227469/