gpt4 book ai didi

ruby-on-rails - Rspec 主题!改变前 block 的 "position"

转载 作者:太空宇宙 更新时间:2023-11-03 18:14:15 26 4
gpt4 key购买 nike

我刚刚在 Rspec 中发现了一些东西(在必要的用头撞墙之后),我希望有人能阐明这些东西。我认为这涉及到我对 Rspec 的 subject! 的误解。

我的理解是 subject! 将运行主题 block ,而不管是否使用 subject,并且该 block 将在适当的时间运行。

似乎发生的事情就是——奇怪的副作用是它会导致内部 subject block 先于 内部 before block 。

即:

  describe 'subject block' do
before { @var = nil }

describe 'Test 1: With a bang' do
subject! { @var = false }
describe 'inner describe' do
before { @var = true }
subject { @var }
it { is_expected.to be true }
end
end

describe 'Test 2: Without a bang' do
subject { @var = false }
describe 'inner describe' do
before { @var = true }
subject { @var }
it { is_expected.to be true }
end
end
end

这个结果指出了问题。测试 1,即在外部 block 中使用 subject! 的测试,失败了。测试 2 使用非 bang subject 通过。测试 1 失败的原因是内部 before block (放置 @var = true 的位置)没有在内部 subject 之前调用,并且因此不会在实际规范之前调用。

这对我来说似乎是错误的。我错过了什么吗?

最佳答案

My understanding is that subject! will run the subject block regardless of whether subject is used, and that block will get run at the appropriate time.

“在适当的时候”很含糊,所以这取决于你的意思。注意事项the docs说:

Just like subject, except the block is invoked by an implicit before hook.

所有the implementation subject! 所做的是委托(delegate)给 subject,然后定义一个调用该主题的 before Hook 。

当您在多层嵌套中使用 before Hook 时,外部上下文 before Hook 将在内部上下文之前运行,正如您所期望的那样。这正是这里发生的事情。

RSpec 的 DSL 在使用得当时非常有用,但它也会混淆事物发生的顺序,当顺序很重要时,我认为你最好将它折叠成一个it 以适当的顺序执行每件事(或者可能为初始的主要设置步骤保留一个 before Hook )。

关于ruby-on-rails - Rspec 主题!改变前 block 的 "position",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28753950/

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