gpt4 book ai didi

ruby - 在 RSpec 中,如何在访问主题的子上下文中添加一个 before 钩子(Hook)?

转载 作者:数据小太阳 更新时间:2023-10-29 07:20:07 24 4
gpt4 key购买 nike

考虑以下几点:

describe MyModel do
context 'updates fields' do
subject { create(:my_model) }
before do
subject.save
subject.reload
end

context 'when changing foo.bar' do
before { subject.foo.bar = 3 }
it { is_expected.to be_multiple_bar }
end

context 'when changing baz.quux' do
before { subject.baz.quux = 3 }
it { is_expected.to be_multiple_quux }
end
end
end

现在,如您所料,我希望在第 10 行和第 15 行之后调用第 4 行的 before Hook 。

我试过两件事:

  1. 我试过使用prepend_before,但这只有在它们定义在同一上下文中时才有效,它不允许您在超上下文中定义的钩子(Hook)之前添加一个钩子(Hook)
  2. 我已经尝试在第 10 行和第 15 行使用 before(:context),虽然这应该使它们的顺序正确,但 RSpec 不允许我在那个时候改变主题. (出于充分的理由,我不打算在这里创建共享状态。)

我真的不想求助于 let(:append_before) { proc { #magic here } } ,因为它丑陋且骇人听闻。此外,我认为我想要的是完全合理的。现在我将这两行复制到所有子上下文,对此我不太满意。

执行此操作的更好方法是什么?

我正在使用 RSpec 3.7、FactoryGirl 4.8.0 和 Ruby 2.3.1

最佳答案

我不知道你的工厂是什么样子,但是为了创建和持久化 my_model,修改、保存和重新加载它,你应该只创建它一次。这也将加快您的规范。

你可以这样写:

describe MyModel do
context 'updates fields' do
subject { create(:my_model, foo: {bar: bar}, baz: {quux: quux}) }

context 'when changing foo.bar' do
let(:bar) { 3 }
it { is_expected.to be_multiple_bar }
end

context 'when changing baz.quux' do
let(:quux) { 3 }
it { is_expected.to be_multiple_quux }
end
end
end

对 let 和 subject 的惰性求值可确保根据上下文正确设置所有参数。如果您需要/想要扩展您的工厂以支持它,请查看 http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md

我希望这是有道理的。

关于ruby - 在 RSpec 中,如何在访问主题的子上下文中添加一个 before 钩子(Hook)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49201543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com