2015-09-14 114 views
2

测试的Python代码,所以我有一个使用gphoto2拍摄一些图像和东西一些代码,我想,以测试这将是包裹gphoto2代码一样的东西,如果测试的最佳方式:然后返回假数据,否则做gphoto2的东西。依赖于硬件

有谁知道我将如何做到这一点,我试着用搜索引擎的一些事情,但我已经没有用,如果单元测试正在运行或没有具体检测到任何运气。

我相信它会是这样的,如果单元测试:但也许有更好的方法来完全做到这一点?

编辑: 因此,根据迄今为止的评论和答案,我尝试了unittest.mock软件包,它没有像我希望的那样工作,请让我解释一下。

如果我有它调用捕获图像的方法(方法B)方法A,然后保存图像和其他一些比特。我已经设法模拟方法B,以便它返回图像或无,当我特别调用方法B时工作正常,但当我尝试调用方法A时,它不使用方法B的模拟,它使用实际的方法B.

如何使方法的使用模拟方式B?

+2

您的代码中不应该包含'if TESTING:',那么您不会测试实际运行的代码;使用*“嘲弄”*来创建一个返回虚拟数据的'gphoto2'版本。 – jonrsharpe

+0

'gphoto2'代码只是你正在做的一小部分。测试另一部分。 –

+0

@PeterWood我的代码使用Django和DRF来接收API请求,然后使用gphoto2捕获图像,然后将URL返回给图像。所以我真的只会测试,如果gphoto2有或没有返回一个图像,然后我的API或者返回一个URL或400_BAD_REQUEST ...所以没有太多的测试。彻底的场景测试已经证明它一切正常,但我希望为我们编写的所有代码编写单元测试。 – Cephlin

回答

1

mock包存在这个原因。

它是一个独立的,PIP-安装包为Python 2;它已被纳入Python版本> = 3.3的标准库(如unittest.mock)。

0

只需在测试代码中使用模拟库。这样你可以屏蔽外部API(在你的情况下是硬件调用)并返回可预测的值。 我会推荐flexmockhttps://pypi.python.org/pypi/flexmock它是超级简单。

在你的测试代码开始时,你会写是这样的: flexmock(SomeObject).should_receive('some_method').and_return('some', 'values')