如何Mock geopandas.read_file测试坐标转美国州函数?解决属性错误
解决Mock geopandas_read_file时的AttributeError问题
你的问题根源在于:get_region_info函数期望geopandas_read_file返回GeoDataFrame对象(自带geometry属性),但你之前mock时传入的是文本文件对象,自然没有geometry属性。不需要上传真实shapefile,直接mock出符合要求的GeoDataFrame即可。
两种解决思路
思路1:用真实的极简GeoDataFrame模拟(推荐)
直接创建一个包含测试用多边形和州数据的小GeoDataFrame,让mock后的geopandas_read_file返回它,完全贴合真实逻辑:
import unittest.mock import geopandas as gpd from shapely.geometry import Polygon, Point from your_module import get_region_info, geopandas_read_file def test_get_region_info(): # 构造一个包含测试点的模拟州多边形 texas_polygon = Polygon([(-100, 30), (-100, 40), (-90, 40), (-90, 30)]) # 创建模拟GeoDataFrame mock_gdf = gpd.GeoDataFrame( {"state_name": ["Texas"]}, geometry=[texas_polygon], crs="EPSG:4326" ) # 替换geopandas_read_file,返回模拟数据 with unittest.mock.patch("your_module.geopandas_read_file", return_value=mock_gdf): # 测试命中州的情况 assert get_region_info(-95, 35) == "Texas" # 测试未命中的情况 assert get_region_info(-80, 35) is None
思路2:完全Mock(不依赖geopandas/shapely)
如果CI环境不想安装geopandas相关依赖,可以直接Mock GeoDataFrame的必要方法和属性:
import unittest.mock from your_module import get_region_info, geopandas_read_file def test_get_region_info_full_mock(): # Mock 不匹配的州行 mock_non_match_row = unittest.mock.Mock() mock_non_match_row.geometry.within.return_value = False # Mock 匹配的州行 mock_match_row = unittest.mock.Mock() mock_match_row.geometry.within.return_value = True mock_match_row.state_name = "Texas" # Mock GeoDataFrame的iterrows方法 mock_gdf = unittest.mock.Mock() mock_gdf.iterrows.return_value = [(0, mock_non_match_row), (1, mock_match_row)] with unittest.mock.patch("your_module.geopandas_read_file", return_value=mock_gdf): assert get_region_info(-95, 35) == "Texas"
关键说明
- 核心是让mock后的
geopandas_read_file返回带有geometry属性的对象,而不是文件流。 - 两种思路都不需要上传真实的USA_States.zip,完全符合CI/CD的无依赖测试要求。
内容的提问来源于stack exchange,提问作者Sink slb
相关产品推荐
相关产品推荐

