TypeError: 'ec2.instancesCollectionManager' object is not iterable when mocking with Moto?
TypeError: 'ec2.instancesCollectionManager' object is not iterable when mocking with Moto?
以下代码在使用 Moto 转换为 list(instances)
时出现错误“TypeError:'ec2.instancesCollectionManager' 对象不可迭代”。
@pytest.fixture(scope='function')
def aws_credentials():
os.environ['AWS_ACCESS_KEY_ID'] = 'testing'
os.environ['AWS_SECRET_ACCESS_KEY'] = 'testing'
os.environ['AWS_SECURITY_TOKEN'] = 'testing'
os.environ['AWS_SESSION_TOKEN'] = 'testing'
os.environ["MOTO_ALLOW_NONEXISTENT_REGION"] = 'True'
os.environ['AWS_DEFAULT_REGION'] = 'us-east-1'
@pytest.fixture
def session(aws_credentials):
return boto3.session.Session()
@mock_ec2
def test_get_nodes(session):
#session = boto3.session.Session(region_name='us-east-1')
filters = None
Node.get_nodes(session, filters)
instances = session.resource('ec2').instances
print(list(instances)) # ERR
assert any(instances) # ERR
如果不使用 Moto,Node
class 中的实例可以转换为 list()
。
class Node(NodeBase):
@classmethod
def get_nodes(cls, session, filters):
instances = session.resource('ec2').instances.filter(Filters=filters)
return instances
print(type(instances))
无论是否使用 Moto 都获得 <class 'boto3.resources.collection.ec2.instancesCollection'>
。
在节点中,您正在调用 instances.filter()
,其中 returns 是 <class 'boto3.resources.collection.ec2.instancesCollection'>
。这个集合是可迭代的,因此可以解压到。一个列表。
但是,在您的测试中,您没有在 .instance 上调用 filter
。这里,instances
的类型是
<class 'boto3.resources.collection.ec2.instancesCollectionManager'>
不可迭代。如果你在上面调用 .all() 或 .filer(),你会再次得到一个可迭代的集合。
以下代码在使用 Moto 转换为 list(instances)
时出现错误“TypeError:'ec2.instancesCollectionManager' 对象不可迭代”。
@pytest.fixture(scope='function')
def aws_credentials():
os.environ['AWS_ACCESS_KEY_ID'] = 'testing'
os.environ['AWS_SECRET_ACCESS_KEY'] = 'testing'
os.environ['AWS_SECURITY_TOKEN'] = 'testing'
os.environ['AWS_SESSION_TOKEN'] = 'testing'
os.environ["MOTO_ALLOW_NONEXISTENT_REGION"] = 'True'
os.environ['AWS_DEFAULT_REGION'] = 'us-east-1'
@pytest.fixture
def session(aws_credentials):
return boto3.session.Session()
@mock_ec2
def test_get_nodes(session):
#session = boto3.session.Session(region_name='us-east-1')
filters = None
Node.get_nodes(session, filters)
instances = session.resource('ec2').instances
print(list(instances)) # ERR
assert any(instances) # ERR
如果不使用 Moto,Node
class 中的实例可以转换为 list()
。
class Node(NodeBase):
@classmethod
def get_nodes(cls, session, filters):
instances = session.resource('ec2').instances.filter(Filters=filters)
return instances
print(type(instances))
无论是否使用 Moto 都获得 <class 'boto3.resources.collection.ec2.instancesCollection'>
。
在节点中,您正在调用 instances.filter()
,其中 returns 是 <class 'boto3.resources.collection.ec2.instancesCollection'>
。这个集合是可迭代的,因此可以解压到。一个列表。
但是,在您的测试中,您没有在 .instance 上调用 filter
。这里,instances
的类型是
<class 'boto3.resources.collection.ec2.instancesCollectionManager'>
不可迭代。如果你在上面调用 .all() 或 .filer(),你会再次得到一个可迭代的集合。