如何测试apt_update调用是否被触发?

时间:2018-02-23 03:30:39

标签: ruby chef apt chefspec

在构建一些配方时,我们发现如果系统已经处于良好状态但是更新仍在运行,那么触发apt_update作为流程的一部分可能会大大减慢速度。

为了解决这个问题,我们使用action做了一个apt_update调用:没有,然后设置任何实际需要更新通知的内容:before或:immediate(比如在安装包之前或添加apt存储库之后,尽管存储库情况在添加时可以通过标志进行控制。

我们想测试apt_update调用是否仅在必要时触发,并且不作为会话的一部分运行,否则将无法安装包。

DROP SCHEMA IF EXISTS local_schema_name CASCADE; 
CREATE SCHEMA local_schema_name ;
IMPORT FOREIGN SCHEMA foreign_schema_name 
    FROM SERVER foreign_server_name INTO local_schema_name ;

2 个答案:

答案 0 :(得分:0)

我花了很长时间才找到实际测试apt_update的代码,甚至更长时间才能理解它,然后当我想测试它总是在我需要它的早期触发的正确时间运行apt_update时更长在编译阶段而不是收敛阶段。

it 'triggered apt update' do
  ppa_call = chef_run.apt_repository('git-core')
  expect(ppa_call).to notify('apt_update[update]').to(:update).immediately
end

it 'default apt update' do
  expect(chef_run).to update_apt_update('update')
end

it 'install git' do
  expect(chef_run).to install_apt_package('git')
end

我不记得我在哪里找到了有条件触发的语法,但在再次查看常规的apt_update测试后,我终于在chefspec示例中找到了它。 https://github.com/chefspec/chefspec/blob/master/examples/apt_update/spec/update_spec.rb

答案 1 :(得分:0)

运行kitchen converge以检查每次运行时是否执行apt_repository,或者如果存储库已存在则跳过。我不确定该资源是否是幂等的。如果它不是幂等的,它肯定会在每次运行时通知更新。我建议为apt_repository添加一个保护子句,以便在存储库已经存在时跳过它。

单元测试无法确认只有在添加新存储库时才会调用更新。