自定义 Rails 初始值设定项作为 class
Custom Rails initializer as a class
我有一个初始化程序可以将一些数据从 csv 文件加载到要在模型中使用的全局变量。现在看起来像这样:
...
XYZ = Hash[*CSV.open...]
现在我想为这个初始化程序写一个 rspec 规范。我正在使用 rubocop-rspec
,它说 describe
不应该采用字符串,而是 class 或模块 (https://www.rubydoc.info/gems/rubocop-rspec/1.1.0/RuboCop/Cop/RSpec/DescribeClass).
假设这是合理的,将初始化程序转换为 class 的选项是什么?
有一个选项可以使用 describe XYZ
,但它似乎不正确。
1) 嗯,你可以将 Hash[*CSV.open...]
包装到一些助手 class 或模块中,比如 DataLoader
,用测试覆盖它,然后像 XYZ = DataLoader.do_stuff(filename)
一样调用你的初始化器。
但是有一个 "issue" 使用这种方法:class 将是真正的 "dumb"(根本不添加任何自定义逻辑,只是包装来自 stdlib 的几个方法)和将仅在初始化程序中使用 - 因此将被调用仅一次。我怀疑所有这些额外的样板是否值得。
所以,我可能会考虑更简单的方法:
2) 忽略(禁用)这个特定案例的特定警察。约定很好,rubocop
也很棒,但有时打破规则比盲目遵循规则会产生更简洁的代码。例如,我有时会为破坏性的 rake 任务添加测试——在这种情况下,我也必须打破这个约定,我会在必要时这样做,因为它仍然比为了约定而人工变通更好……需要测试一个初始化程序逻辑的一小部分?就去做吧:)
我有一个初始化程序可以将一些数据从 csv 文件加载到要在模型中使用的全局变量。现在看起来像这样:
...
XYZ = Hash[*CSV.open...]
现在我想为这个初始化程序写一个 rspec 规范。我正在使用 rubocop-rspec
,它说 describe
不应该采用字符串,而是 class 或模块 (https://www.rubydoc.info/gems/rubocop-rspec/1.1.0/RuboCop/Cop/RSpec/DescribeClass).
假设这是合理的,将初始化程序转换为 class 的选项是什么?
有一个选项可以使用 describe XYZ
,但它似乎不正确。
1) 嗯,你可以将 Hash[*CSV.open...]
包装到一些助手 class 或模块中,比如 DataLoader
,用测试覆盖它,然后像 XYZ = DataLoader.do_stuff(filename)
一样调用你的初始化器。
但是有一个 "issue" 使用这种方法:class 将是真正的 "dumb"(根本不添加任何自定义逻辑,只是包装来自 stdlib 的几个方法)和将仅在初始化程序中使用 - 因此将被调用仅一次。我怀疑所有这些额外的样板是否值得。
所以,我可能会考虑更简单的方法:
2) 忽略(禁用)这个特定案例的特定警察。约定很好,rubocop
也很棒,但有时打破规则比盲目遵循规则会产生更简洁的代码。例如,我有时会为破坏性的 rake 任务添加测试——在这种情况下,我也必须打破这个约定,我会在必要时这样做,因为它仍然比为了约定而人工变通更好……需要测试一个初始化程序逻辑的一小部分?就去做吧:)