【问题标题】:Why let(:counter) { 0 } returns nil in example?为什么 let(:counter) { 0 } 在示例中返回 nil?
【发布时间】:2020-02-29 21:47:00
【问题描述】:

在 Rspec 中有两个变量,它们都是整数,但在示例中(在“之前”块中),其中一个是适当的自己的值,另一个是 nil。为什么?!从未听说过这种奇怪的 rspec 行为。

尝试将 0 值更改为 1, 尝试更改变量名称, 尝试将“让”更改为“让!”, 但行为没有改变。

代码是:

context 'when input contains incorrect symbols' do
      let(:counter) { 1 }
      let(:mocked_retry_count) { 5 }
      before do
        allow(described_class).to receive(:gets) {
          byebug
          counter += 1
          counter > mocked_retry_count ? 'Stop the loop' : ['$', (0..9).to_a.sample, '#', '%', '&'].sample
        }
        described_class.ask_kingdoms
      end
    end

在 byebug 的输出中我看到了

   62:       let(:counter) { 1 }
   63:       let(:mocked_retry_count) { 5 }
   64:       before do
   65:         allow(described_class).to receive(:gets) {
   66:           byebug
=> 67:           counter += 1
   68:           counter > mocked_retry_count ? 'Stop the loop' : ['$', (0..9).to_a.sample, '#', '%', '&'].sample
   69:         }
   70:         described_class.ask_kingdoms
   71:       end
(byebug) counter
nil
(byebug) mocked_retry_count
5

'counter' 和 'mocked_retry_count' 之间的主要区别是什么?在示例中如何获取我的计数器?

【问题讨论】:

标签: ruby rspec factory-bot


【解决方案1】:

为什么let(:counter) { 0 } 在示例中返回 nil?

不,它没有。 counter 不是你想的那样。尝试评估/打印defined?(counter)defined?(mocked_retry_count)

“counter”和“mocked_retry_count”的主要区别是什么?

您没有分配给mocked_retry_count。请记住,let 创建方法。因此,当您尝试分配给counter 时,您正在创建一个局部变量counter,它会影响您的方法counter(默认值为nil)。

这篇文章有更详细的解释:Why is `a = a` `nil` in Ruby?

【讨论】:

  • ? ` (byebug) 定义了吗?(counter) "local-variable" (byebug) 定义了吗?(mocked_retry_count) "method" (byebug) counter nil (byebug) mocked_retry_count 5 `
  • 是的,你是对的,counter 这里是local variable(但我还是不明白,为什么它是nil)和mocked_retry_countmethod,并且如果我将counter 重命名为counter_i,它会按预期工作(因为它变成了method)。我会阅读您分享的链接,无论如何,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多