2

在过去的几周里,我一直在编写 ChefSpec 单元测试套件,并设法用它做了很多事情,但我发现了一个让我难过的场景。我有一个包含“aws”食谱的默认食谱的食谱,它依次安装right_aws然后继续require它。

但是 ChefSpec 运行程序似乎有问题,吐出 Ruby LoadError:

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:  

有没有办法require 'right_aws'在我的测试中模拟“aws”食谱中的那条线?推荐吗?在运行 ChefSpec 测试的系统上简单地安装 right_aws gem 会更好吗?

4

1 回答 1

3

你有几个选择:

  1. 您可以right_aws通过直接在您的机器上或使用 Gemfile 安装它来确保可用(如问题评论中所述)
  2. 您可以直接模拟对 include_recipe 的调用(如果您的测试不需要包含的配方)

    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)
    
  3. 模拟 requires 调用本身。

    allow(Kernel).to receive(:require) 
    allow(Kernel).to receive(:require).with("right_aws").and_return(true)
    

如果可能的话,我会推荐#2

于 2014-09-26T17:09:43.303 回答