devtools::test()报错:无法找到MyClass对应set_field_1的继承方法
问题原因
单文件测试test_file运行时调用的是你当前开发环境中已经手动加载/运行过的S4方法,而devtools::test()会在独立环境中重新加载你构建后的包,仅识别包正式导出的内容。你遇到的报错核心原因是S4方法未正确导出,包加载时方法没有注册到泛型上。
解决步骤
- 第一步:给S4方法补充roxygen2导出标签
你当前的代码只给set_field_1泛型加了@export,但对应MyClass的方法没有导出声明,需要给setMethod补充注释:
#' @rdname set_field_1 #' @export setMethod("set_field_1", signature = "MyClass", definition = function(object, value) { object@field_1 <- value return(object) } )
@rdname会将方法文档和泛型文档合并,@export会触发roxygen2自动生成方法导出声明。
- 第二步:重新生成NAMESPACE文件
运行以下命令强制更新命名空间配置:
devtools::document(roclets = c('rd', 'collate', 'namespace'))
生成后检查项目根目录的NAMESPACE文件,确认存在以下两行:
export(set_field_1) exportMethods(set_field_1)
- 第三步:清理旧缓存重新测试
先卸载本地已加载的旧版本包、清理构建缓存:
devtools::unload("你的包名") devtools::clean_dll()
再运行devtools::load_all()确认本地调用正常后,执行devtools::test()即可正常通过测试。
内容的提问来源于stack exchange,提问作者Conor
相关产品推荐
相关产品推荐

