在过去的几周里,我一直在编写chefspec单元测试套件,并且已经做了很多工作,但是我发现了一个让我困惑的场景。我有一个包含“aws”菜谱默认菜谱的菜谱,它依次安装right_aws,然后继续require
但是chefspec运行程序似乎有问题,它抛出了一个ruby加载错误:

LoadError
---------
cannot load such file -- right_aws

Cookbook Trace:
---------------
  /var/folders/0r/cg1hmpkj2nb3wh6slrg1hkhm0000gn/T/d20140612-36208-q1ecjj/cookbooks/aws/recipes/default.rb:25:in `from_file'
  /var/folders/0r/cg1hmpkj2nb3wh6slrg1hkhm0000gn/T/d20140612-36208-q1ecjj/cookbooks/acmecorp-postgresql/recipes/server.rb:71:in `from_file'

Relevant File Content:
----------------------
/var/folders/0r/cg1hmpkj2nb3wh6slrg1hkhm0000gn/T/d20140612-36208-q1ecjj/cookbooks/aws/recipes/default.rb:

 18:  #
 19:
 20:  chef_gem "right_aws" do
 21:    version node['aws']['right_aws_version']
 22:    action :install
 23:  end
 24:
 25>> require 'right_aws'
 26:

在我的测试中,有没有办法嘲笑“aws”菜谱中的那一行?是推荐的吗?
在运行chefspec测试的系统上安装正确的aws gem会更好吗?

最佳答案

你有几个选择:
您可以通过直接在您的计算机上安装right_aws或使用gemfile(如问题注释中所述)来确保可用。
您可以模拟直接包含配方的调用(如果您不需要测试所包含的配方)

allow_any_instance_of(Chef::Recipe).to receive(:include_recipe)
allow_any_instance_of(Chef::Recipe).to receive(:include_recipe).with('aws').and_return(true)

模拟requires调用本身。
allow(Kernel).to receive(:require)
allow(Kernel).to receive(:require).with("right_aws").and_return(true)

如果可能的话,我建议

10-06 14:15
查看更多