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 符合您的需要。