2015-11-24 69 views
1

我在我的宝石中有Constant,它会在启动服务器时从使用应用程序中获取数据。但是当我执行测试用例时,我怎样才能跳过那个常量调用,以免它抛出任何错误。如何在全局常量抛出错误时执行rspec?

#file in my gem 
class FallbackConfig 
    DATA = YAML.load(File.open(File.join('config','fallback_data','data.yml')))  
end 

使用gem运行应用程序时没有问题。但是当我执行测试用例时,那个时候它也在寻找这个值并抛出以下错误。

Praveen-Mac-mini:global-nav-gem brilliomac$ rspec spec 
Coverage report generated for RSpec to /Users/brilliomac/Desktop/global-nav-gem/coverage. 22/88 LOC (25.0%) covered. 
/Users/brilliomac/Desktop/global-nav-gem/lib/global_nav_gem/configuration_file.rb:2:in `initialize': No such file or directory @ rb_sysopen - config/fallback_data/global_nav_data.yml (Errno::ENOENT) 

回答

0

您可以在您的测试试试这个:

it 'my test' do 
    some_hash = {} 
    stub_const(FallbackConfig::DATA, some_hash) 
    expect(FallbackConfig::DATA).to eq some_hash 
end 

你可以找到更多关于使用RSpec here

+0

当测试用例执行并抛出错误时,stubbing会适用。但对于我来说,它在执行任何testcase之前执行上述类并抛出找不到错误文件。 – Praveenkumar

0

开关不断向memoizes数据类方法磕碰的常量:

class FallbackConfig 
    def self.data 
    @data ||= YAML.load(...) 
    end 
end 

然后改变常量的用户调用类方法相反。数据将被加载 - 只有一次 - 如果它被使用,但没有被加载,如果它没有被使用。

0

需要你的文件会立即调用解析YAML文件,带走改进类的可能性或重新定义常量或其他任何东西。我在这种情况下看到的唯一解决方案(但我不喜欢它)是在需要文件并临时恢复之前临时重新定义YAML.load方法。

但是确实使用类方法而不是常量作为@ wayne-conrad的建议会更容易。