当前位置: 首页 > news >正文

kitex出现:open conf/test/conf.yaml: no such file or directory

open conf/test/conf.yaml: no such file or directory

https://github.com/cloudwego/cwgo/issues/120
https://github.com/cloudwego/cwgo/issues/29

在使用Kitex生成的代码中,单元测试时回报错,如标题所示。出现该错的原因是,biz/service单元测试方法同样需要完全的框架测试,而不是独立的单元测试,就像spring boot在进行单元测试时,需要加载整个的spring环境。

看到获取conf.yaml的源码:

func initConf() {prefix := "conf"confFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), "conf.yaml"))content, err := ioutil.ReadFile(confFileRelPath)if err != nil {panic(err)}conf = new(Config)err = yaml.Unmarshal(content, conf)if err != nil {hlog.Error("parse yaml error - %v", err)panic(err)}if err := validator.Validate(conf); err != nil {hlog.Error("validate config error - %v", err)panic(err)}conf.Env = GetEnv()pretty.Printf("%+v\n", conf)
}

调用该方法时默认会中当前目录下按照设置的位置查找配置文件,而配置文件实在根目录下,所以显然是找不到的。

此时只需要将查找conf.yaml的位置设置为绝对的路径,这样不管在那个文件下使用单元测试,配置文件的修改都是从绝对目录查询,就不会报错找不到了。

需要注意的conf.go虽然是在[project]/conf下,但是代码中确实动态变化的,也就是谁调用conf.goinitconf方法,获取的就是调用者当前的路径。

以下有三个获取路径的方法请选择合适的应用:

package mainimport ("fmt""os""path/filepath"
)func main() {// 获取当前工作目录的绝对路径currentDir, err := os.Getwd()if err != nil {fmt.Println("Error:", err)return}fmt.Println("Current working directory:", currentDir)// 获取当前文件的绝对路径currentFile, err := os.Executable()if err != nil {fmt.Println("Error:", err)return}fmt.Println("Current executable file:", currentFile)// 获取当前项目根目录的绝对路径projectRoot := filepath.Dir(currentFile)fmt.Println("Project root directory:", projectRoot)
}

小编的想法是:

  1. 获取conf调用者的绝对路径os.Getwd()
  2. 由于go无法获取整个项目的绝对路径,那么就需要对路径解析获取项目绝对路径
  3. 使用filepathDir(currentDir)获取上一级目录
  4. 使用filepath.Base(currentDir)获取3的最后一个目录的名称,并与项目根目录比较
  5. 相等就说明该路径为绝对路径
  6. 通过1,2,3,4,5不论在任何目录调用,不论绝对地址如何变化,都可以获取项目根目录
  7. 根目录(项目名的比较可以从配置文件,或者从main函数得到,不要想我一些写死在代码中) 【可选】

那么修改后的conf的initConf代码如下:

func initConf() {//prefix := "conf"//confFileRelPath := filepath.Join(prefix, filepath.Join(GetEnv(), "conf.yaml"))// configuration the absolute path of conf filecurrentDir ,err  := os.Getwd()// Go语言并知道那个是整个项目的根路径,需要人为判断for{currentDir = filepath.Dir(currentDir)// 该项目名可在配置文件获取if filepath.Base(currentDir) == "food_platform"{break}}confFileRelPath := currentDir + "/conf/test/conf.yaml"content, err := ioutil.ReadFile(confFileRelPath)if err != nil {panic(err)}conf = new(Config)err = yaml.Unmarshal(content, conf)if err != nil {hlog.Error("parse yaml error - %v", err)panic(err)}if err := validator.Validate(conf); err != nil {hlog.Error("validate config error - %v", err)panic(err)}conf.Env = GetEnv()pretty.Printf("%+v\n", conf)
}

/testfood_platform都可以从main函数中定义。甚至再创建一个yaml文件作为这两个的配置文件都行。

http://www.lryc.cn/news/266489.html

相关文章:

  • sql server多表查询
  • 如何利用PPT绘图并导出清晰图片
  • 1.倒排索引 2.逻辑斯提回归算法
  • Kafka消费者组
  • 四. 基于环视Camera的BEV感知算法-BEVDepth
  • CentOS系统环境搭建(二十五)——使用docker compose安装mysql
  • 协作机器人(Collaborative-Robot)安全碰撞的速度与接触力
  • 第11章 GUI Page400~402 步骤二 画直线
  • 华为gre隧道全部跑静态路由
  • 【c++】入门1
  • Python之Django项目的功能配置
  • P4 音频知识点——PCM音频原始数据
  • 解决Electron中WebView加载部分HTTPS页面白屏的方法
  • 【Java中创建对象的方式有哪些?】
  • npm使用详解(好吧好吧是粗解)
  • uniapp自定义头部导航怎么实现?
  • 什么是 Dubbo?它有哪些核心功能?
  • (2021|CoRR,AugCLIP,优化)FuseDream:通过改进的 CLIP+GAN 空间优化实现免训练文本到图像生成
  • python pip安装依赖的常用软件源
  • 避免大M取值过大引起的数值问题
  • 史密斯圆图的使用
  • 可重复读解决了哪些问题? 对 SQL 慢查询会考虑哪些优化 ?
  • 从0开始python学习-35.allure报告企业定制
  • 蓝桥杯2020年10月青少组Python程序设计省赛真题
  • 【数据结构】布隆过滤器原理详解及其代码实现
  • Qt中实现短信验证码功能
  • Redis-运维
  • Qt制作定时关机小程序
  • LeetCode day30
  • 数据分析基础之《numpy(5)—合并与分割》