Mock 的迭代数组:Mock 对象不可迭代
Iterating array of Mock: Mock object is not iterable
我正在尝试使用 Python UnitTest 迭代模拟对象数组。
当我 运行 测试时,出现错误:
Error while generating images - 'Mock' object is not iterable
这是我要测试的函数:
def generate_images(models, latent_dim=120, n_samples=20):
latent_points = generate_latent_points(latent_dim, n_samples)
batch_size = n_samples / len(models)
images = []
try:
for i in range(len(models)):
start = int(i * batch_size)
end = int((i * batch_size) + batch_size - 1)
gen_imgs = models[i].predict(latent_points[start:end])
images = [*images, *gen_imgs]
image_matplot = encode_images(np.asarray(images))
return image_matplot
except Exception as e:
print("Error while generating images - ", e)
这是我的测试函数:
def test_image_generation(self):
# Given
model = Mock()
models = [model, model]
# When
result = generate_images(models, 120, 10)
# Then
model.predict.assert_called()
self.assertIsNotNone(result)
self.assertIs(type(result), io.BytesIO)
我进行了调试,代码似乎在 for 循环中执行了 运行 并调用了“预测”函数,但在该循环中传递的次数不超过一次,异常随“模拟对象不可迭代”。
我不明白这个错误,因为当我调试并检查“models”数组的类型时,我得到了“list”。
问题出在这里
gen_imgs = models[i].predict(latent_points[start:end])
images = [*images, *gen_imgs]
gen_imgs 又是一个 Mock,您正试图解压它。但是,它是不可迭代的,因此您无法解压它。您可以将 predict 函数显式模拟为 return 一个可迭代对象。像
m = Mock()
m.predict = Mock(return_value=[1,2,3])
但可能有不同的 return_value 符合您的需要。
我正在尝试使用 Python UnitTest 迭代模拟对象数组。
当我 运行 测试时,出现错误:
Error while generating images - 'Mock' object is not iterable
这是我要测试的函数:
def generate_images(models, latent_dim=120, n_samples=20):
latent_points = generate_latent_points(latent_dim, n_samples)
batch_size = n_samples / len(models)
images = []
try:
for i in range(len(models)):
start = int(i * batch_size)
end = int((i * batch_size) + batch_size - 1)
gen_imgs = models[i].predict(latent_points[start:end])
images = [*images, *gen_imgs]
image_matplot = encode_images(np.asarray(images))
return image_matplot
except Exception as e:
print("Error while generating images - ", e)
这是我的测试函数:
def test_image_generation(self):
# Given
model = Mock()
models = [model, model]
# When
result = generate_images(models, 120, 10)
# Then
model.predict.assert_called()
self.assertIsNotNone(result)
self.assertIs(type(result), io.BytesIO)
我进行了调试,代码似乎在 for 循环中执行了 运行 并调用了“预测”函数,但在该循环中传递的次数不超过一次,异常随“模拟对象不可迭代”。
我不明白这个错误,因为当我调试并检查“models”数组的类型时,我得到了“list”。
问题出在这里
gen_imgs = models[i].predict(latent_points[start:end])
images = [*images, *gen_imgs]
gen_imgs 又是一个 Mock,您正试图解压它。但是,它是不可迭代的,因此您无法解压它。您可以将 predict 函数显式模拟为 return 一个可迭代对象。像
m = Mock()
m.predict = Mock(return_value=[1,2,3])
但可能有不同的 return_value 符合您的需要。