繁体   English   中英

如何模拟 Terraform 函数

[英]How to mock Terraform functions

我正在研究 Terraform,作为测试爱好者,我正在使用Terratest 对其进行测试,但是我无法模拟Terraform 的函数,例如timestamp() 尝试了一些东西,例如将图书馆猴子用于 mocking,但到目前为止,我的方法都没有奏效。

有没有人知道如何模拟 terraform 的功能来测试提案?

这里有一个小例子可以说明我的问题:

文件:main.tf

locals {
  creation_time = formatdate("YYYYMMDDhhmmss", timestamp())
}

文件:outputs.tf

output "CreationDate" {
  value = local.creation_time,
  description = "Bla bla bla"
}

./tests/main_test.go

package study

import (
  "testing"
  "github.com/stretchr/testify/assert"
  "github.com/stretchr/terratest/modules/terraform"
  "bou.ke/monkey"
)

func Test(t * testing.T) {
  t.Parallel()

  terraformOptions := &terraform.Options{
    TerraformDir" "../",
  }

  monkey.Patch(time.Now, func() time.Time {
    return time.Date(2022, 12, 8, 23, 59, 1, time.UTC)
  })

  defer terraform.Destroy(t, terraformOptions)
  terraform.InitAndApply(t, terraformOptions)

  output = terraform.Output(t, terraformOptions, "CreationDate")
  assert.Equal(t, "20221208235901", output)
}

关于如何运行它的超级简化示例:

go mod init study
go mod tidy
cd tests
go test

因此,我期望从 Terraform 模拟 function 并断言此值以确保 terraform 的文件/模块执行预期的操作。

与其他一些语言不同,Terraform 语言不支持这种“猴子补丁”式的 mocking,您可以在其中单方面更改整个程序的某些内容的定义。

Terraform 模块的行为只能基于输入变量和提供者行为,因此您可以向模块添加可选功能以使其显式可配置,如果您愿意:

variable "override_timestamp" {
  type    = string
  default = null
}

locals {
  creation_time = coalesce(var.override_timestamp, timestamp())
}

当然,这种技术不会测试您的模块在正常情况下是否实际调用timestamp ,因此这是否真的对测试有用值得怀疑。

将测试驱动程序设计为验证时间戳是否具有整体正确的语法然后对其进行一些模糊匹配可能更有利可图,例如断言报告的瞬间大于或等于测试开始时间且小于或等于等于测试结束时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM