python - 单元测试检查是否主要调用方法
问题描述
我有一个main
看起来像这样的方法:
class Example:
...
def main(self):
self.one()
self.two(list)
self.three(self.four(4))
如何检查调用main
它是否调用了它里面的以下方法?
我努力了:
def setUp(self):
self.ex = example.Example()
def test_two(self):
# testing method two that has only list.append(int) and returns list
mock_obj = Mock()
self.ex.two(mock_obj, 1)
self.assertEqual(call.append(1),mock_obj.method_calls[0]) # works fine
mock_obj.method.called # throws False ...why?
def test_main(self):
with patch('example.Example') as a:
a.main()
print(a.mock_calls) # [call.main()]
...
def test_main(self):
mock_obj = Mock()
self.ex.main(mock_obj) # throws TypeError: main() takes exactly 1 argument (2 given)
print(mock_obj.method_calls) # expected one, two, three and four method calls
老实说,真的需要任何帮助。
将 Python 2.6.6 与 unittest 和 mock 模块一起使用
解决方案
通过单元测试,您原则上可以测试这四个函数是否真的会被调用。而且,您当然可以通过嘲笑所有这些来做到这一点。但是,无论如何,您以后都需要进行集成测试,以确保函数以正确的顺序被调用,参数的顺序正确,参数的值是被调用者期望的形式,返回值是预期的形式等。
你可以在单元测试中检查所有这些东西——但这没有多大价值,因为如果你对这些点之一有错误的假设,你的错误假设将进入你的代码和单元测试。也就是说,单元测试将完全针对您的错误假设进行测试并且会通过。找出你的错误假设需要一个集成测试,其中真正的调用者和被调用者聚集在一起。
总结:您的主要方法是交互主导的,因此应该直接通过交互测试(也称为集成测试)进行测试,而不是通过单元测试加上后续的交互测试。
推荐阅读
- java - Android Studio - Android Studio 中的问题
- linux - 使用 shell 脚本使用 conf 文件数据更新 ini 文件
- c# - 集合中的更改不会更新 LiveCharts 图
- cmake - CMake 关于编写我自己的 find_package 模块的几个问题
- reactjs - 除图像外,注册表单数据未存储在 Firebase 上
- android - 通知高度可以调整到任何值吗?
- android - 查找类 kotlin.coroutines.Continuation 中的 kotlin Corountines 和实时数据集成错误
我在项目中面临实时数据和协程问题。我收到以下错误
kotlin.coroutines.Continuation> p1) { ^ 符号:class BookJson 位置:class BookC
- java - 在 Java 中解析 JSON 返回空结果
- ruby - 如何根据Ruby中的条件从哈希数组中删除哈希
- python - 为什么我不能用 python 从谷歌下载图片?