ruby-on-rails - 为什么实例变量有时会在 RSpec 测试中被过度使用?

标签 ruby-on-rails ruby testing rspec rspec-rails

<分区>

我注意到在 RSpec 单元测试等中使用实例变量的例子。

像这样:

it 'should update something' do
  @user = user(:userone)
  @attr = {
    :name => 'this',
    :phone => 'that'
  }
  put :update, :id => @user.id, :user => @attr

  @user.reload
  expect(response.status).to eq(200)
  expect(@user.name).to eq('this')
  expect(@user.phone).to eq('that')
end

如果不在 before :each 等中设置变量,为什么不直接使用局部变量?

最佳答案

总体问题是测试中的变量(就像任何程序中的变量一样)应该具有尽可能小的范围。这使读者更容易理解测试,因为它最大限度地减少了他们必须考虑的代码量,并且通常可以提高运行时的效率。因此,如果一个实例变量(或者,在当前的 RSpec 中,一个 let 变量)可以是本地的(不会重复代码或降低效率),它应该是。

当将数据从 before block 传递到示例(it block )的最佳可用方式是在实例变量中时,我曾经看到过这样的规范你的榜样一直。有时它们是由没有经验的程序员编写的,他们看到规范中使用了很多实例变量并且不假思索地模仿了它。 (我仍然在 Rails Controller 中看到同样的错误。)有时,它们是由于有人内联了一个 before block ,但没有费心将不再需要作为实例变量的实例变量更改为局部变量。

最近 RSpec 提供了 letlet 比实例变量更好的一个原因是 let 变量的使用看起来像局部变量,因此如果将局部变量更改为let 变量,反之亦然。然而,我仍然经常看到测试数据的问题,它只在一个示例中使用,而在 let 变量中定义它可以而且应该只是本地的。就像过度使用实例变量一样,这有时是由于缺乏经验的程序员不假思索地模仿示例,有时是由于测试更改后未能清理导致 let 变量变得不必要。

关于ruby-on-rails - 为什么实例变量有时会在 RSpec 测试中被过度使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35890648/

相关文章:

javascript - 如何将被覆盖的属性保存为nil?

ruby-on-rails - assert_equal 语法

ruby - Rspec Controller 中显示的#<RSpec::Core::ExampleGroup::Nested_1 的未定义方法 `get'

Ruby:如何获取文件锁以进行写入?

python - 在 FastAPI 中测试 Pydantic 设置

ruby-on-rails - Rails 5,设计嵌套属性,不允许的参数

javascript - 当我使用浏览器后退按钮时保持 javascript 更改(jquery,rails 3)

javascript - Rails 使用 Javascript 防止伪造

testing - 删除 Clojure REPL 中定义的测试

email - 测试电子邮件功能的好方法