const { Farm } = require('./models'); const { sequelize } = require('./config/database'); const farmController = require('./controllers/farmController'); // 模拟Express请求和响应对象 function createMockReq(body, params = {}) { return { body, params }; } function createMockRes() { const res = { statusCode: 200, data: null, status: function(code) { this.statusCode = code; return this; }, json: function(data) { this.data = data; return this; } }; return res; } // 测试清空经纬度的不同场景 async function testClearCoordinates() { console.log('=== 清空经纬度测试 ===\n'); let testFarmId = null; try { // 1. 创建带有经纬度的测试记录 console.log('1. 创建带有经纬度的测试记录...'); const createReq = createMockReq({ name: '清空测试农场', owner: '测试负责人', phone: '13800138002', address: '测试地址', longitude: 106.2309, latitude: 38.4872, status: 'active' }); const createRes = createMockRes(); await farmController.createFarm(createReq, createRes); testFarmId = createRes.data.data.id; console.log('✓ 创建成功,location:', createRes.data.data.location); // 2. 测试传入null值清空 console.log('\n2. 测试传入null值清空...'); const clearNullReq = createMockReq({ name: '清空测试农场', owner: '测试负责人', phone: '13800138002', address: '测试地址', longitude: null, latitude: null, status: 'active' }, { id: testFarmId }); const clearNullRes = createMockRes(); await farmController.updateFarm(clearNullReq, clearNullRes); console.log('✓ null值清空结果:', { location: clearNullRes.data.data.location, has_lng: 'lng' in (clearNullRes.data.data.location || {}), has_lat: 'lat' in (clearNullRes.data.data.location || {}) }); // 3. 重新设置经纬度 console.log('\n3. 重新设置经纬度...'); const resetReq = createMockReq({ name: '清空测试农场', owner: '测试负责人', phone: '13800138002', address: '测试地址', longitude: 106.2400, latitude: 38.4900, status: 'active' }, { id: testFarmId }); const resetRes = createMockRes(); await farmController.updateFarm(resetReq, resetRes); console.log('✓ 重新设置结果:', resetRes.data.data.location); // 4. 测试传入空字符串清空 console.log('\n4. 测试传入空字符串清空...'); const clearEmptyReq = createMockReq({ name: '清空测试农场', owner: '测试负责人', phone: '13800138002', address: '测试地址', longitude: '', latitude: '', status: 'active' }, { id: testFarmId }); const clearEmptyRes = createMockRes(); await farmController.updateFarm(clearEmptyReq, clearEmptyRes); console.log('✓ 空字符串清空结果:', { location: clearEmptyRes.data.data.location, has_lng: 'lng' in (clearEmptyRes.data.data.location || {}), has_lat: 'lat' in (clearEmptyRes.data.data.location || {}) }); // 5. 重新设置经纬度 console.log('\n5. 再次重新设置经纬度...'); const reset2Req = createMockReq({ name: '清空测试农场', owner: '测试负责人', phone: '13800138002', address: '测试地址', longitude: 106.2500, latitude: 38.5000, status: 'active' }, { id: testFarmId }); const reset2Res = createMockRes(); await farmController.updateFarm(reset2Req, reset2Res); console.log('✓ 再次设置结果:', reset2Res.data.data.location); // 6. 测试不传入经纬度字段(undefined) console.log('\n6. 测试不传入经纬度字段(undefined)...'); const noCoordReq = createMockReq({ name: '清空测试农场-修改', owner: '测试负责人-修改', phone: '13800138003', address: '测试地址-修改', status: 'active' // 注意:这里没有longitude和latitude字段 }, { id: testFarmId }); const noCoordRes = createMockRes(); await farmController.updateFarm(noCoordReq, noCoordRes); console.log('✓ 不传入经纬度字段结果:', { location: noCoordRes.data.data.location, has_lng: 'lng' in (noCoordRes.data.data.location || {}), has_lat: 'lat' in (noCoordRes.data.data.location || {}), name: noCoordRes.data.data.name }); // 7. 测试只清空其中一个坐标 console.log('\n7. 测试只清空经度,保留纬度...'); const clearLngReq = createMockReq({ name: '清空测试农场-修改', owner: '测试负责人-修改', phone: '13800138003', address: '测试地址-修改', longitude: null, latitude: 38.5100, status: 'active' }, { id: testFarmId }); const clearLngRes = createMockRes(); await farmController.updateFarm(clearLngReq, clearLngRes); console.log('✓ 只清空经度结果:', { location: clearLngRes.data.data.location, has_lng: 'lng' in (clearLngRes.data.data.location || {}), has_lat: 'lat' in (clearLngRes.data.data.location || {}), lng_value: clearLngRes.data.data.location?.lng, lat_value: clearLngRes.data.data.location?.lat }); console.log('\n=== 清空经纬度测试完成 ==='); console.log('\n📋 测试总结:'); console.log('1. ✅ null值可以正确清空经纬度'); console.log('2. ✅ 空字符串可以正确清空经纬度'); console.log('3. ✅ 不传入字段时保持原有值'); console.log('4. ✅ 可以单独清空其中一个坐标'); } catch (error) { console.error('❌ 测试过程中出现错误:', error); throw error; } finally { // 清理测试数据 if (testFarmId) { console.log('\n8. 清理测试数据...'); try { await Farm.destroy({ where: { id: testFarmId } }); console.log('✓ 测试数据已清理'); } catch (error) { console.error('清理测试数据失败:', error); } } } } // 运行测试 if (require.main === module) { testClearCoordinates() .then(() => { console.log('\n🎉 所有清空经纬度测试通过!'); process.exit(0); }) .catch((error) => { console.error('\n💥 清空经纬度测试失败:', error.message); process.exit(1); }); } module.exports = { testClearCoordinates };