问题描述
我有一个詹金斯(Jenkins)共享库,与公司中的许多贡献者一样。我最近开始研究使用jenkins-spock库对该库实施一些单元测试。
但是,我在测试以下问题(该问题的简化版本)时遇到了一些麻烦,希望能有所帮助。
假设在vars
文件夹中有两个脚本的共享库分别为archive.groovy
和fs.groovy
。这两个脚本都以return this
结尾。
这是fs.groovy
的内容:
void copyFiles(pattern,destination) {
fileOperations([
filecopyOperations(includes: pattern,excludes: "*.log",targetLocation: destination,flattenFiles: false)
])
}
return this
这是archive.groovy
的内容:
void call(src) {
fs.copyFiles(src,"/opt/archival_dir")
}
return this
在我的pom.xml
文件中,我添加了提供filecopyOperations
步骤的插件:
<dependency>
<groupId>sp.sd</groupId>
<artifactId>file-operations</artifactId>
<version>1.11</version>
<scope>test</scope>
</dependency>
我的测试如下:
class ArchiveSpec extends JenkinsPipelinespecification {
def archive = null
def setup() {
archive = loadPipelinescriptForTest("/vars/archive.groovy")
}
def "calling archive copies the files to the right location"() {
setup:
String sourceFiles = ["a","b","c"].join(",")
when:
archive.call(sourceFiles)
then:
1* getPipelineMock("filecopyOperation.call")(_) >> {
it.includes == sourceFiles
it.excludes == "*.log"
it.targetLocation == "/opt/archival_dir"
}
}
}
但是,以上结果导致出现以下错误:
org.spockframework.mock.TooFewInvocationsError:
Too few invocations for:
1* getPipelineMock("filecopyOperation.call")(_) >> {
it.includes == sourceFiles
it.excludes == "*.log"
it.targetLocation == "/opt/archival_dir"
} (0 invocations)
唯一匹配的调用如下:
Mock for type 'Closure' named '(implicit-runtime) getPipelineMock("fs.copyFiles")'
因此,我似乎无法从fs.copyFiles
中测试archive.call
的内容。
另一方面,当我尝试直接测试fs.copyFiles
函数调用时,我可以执行如下的filecopyOperation
步骤:
class Fsspec extends JenkinsPipelinespecification {
def fs= null
def setup() {
fs = loadPipelinescriptForTest("/vars/fs.groovy")
}
def "call fs.copyFiles uses right args"() {
setup:
String sourceFiles = ["a",")
String dst = "destination"
when:
fs.copyFiles(sourceFiles,dst)
then:
1* getPipelineMock("filecopyOperation.call")(_) >> {
it.includes == sourceFiles
it.targetLocation == dst
}
}
}
我想我应该做一些explicitlyMockPipelineVariable("fs")
,但似乎无法使它工作。我也尝试加载fs.groovy
文件,就像在archive = loadPipelinescriptForTest("/vars/archive.groovy")
的设置功能中使用ArchiveSpec
一样,但这并不能解决问题。
是否可以使用jenkins-spock测试这种情况?如果没有,如何使用https://github.com/jenkinsci/JenkinsPipelineUnit达到相同的目的?
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)