ruby-on-rails - rspec not_to 从不按预期行为改变

标签 ruby-on-rails rspec2 rspec-rails

我在 rspec 和 rspec-rails 2.11.0 中遇到了一些莫名其妙的行为。我在运行 2.7.1(均在 ruby​​ 1.9.3 上)的同事应用程序上重现了该行为

这些测试按预期工作(失败):

it "should not change i" do
    i = 0
    expect {
      i = 2
    }.not_to change { i }
end

it "should not change i" do
    i = 0
    expect {
      i = 2
    }.not_to change { i }.from( 0 )
end

在两种情况下,失败消息都是“结果不应该改变,但确实从 0 变为 2”

将期望中的“from”更改为不同的值会莫名其妙地使其通过,而不是失败,无论期望块中的 i 值发生什么变化:
it "should not change i" do
    i = 0
    expect {
        i = 2
    }.not_to change { i }.from( 1 )
end

我最近才升级到 1.9.3,我可以肯定地说,如果我曾经遇到过这种行为,我之前就会注意到这种行为。谁能解释这个和/或我做错了什么?

最佳答案

我不认为它完全符合您的期望,但是编写测试的方式并没有真正暴露这一点。您的最后一个值失败,因为它从未定义为 1。

揭示这一点的主要步骤是反转测试。

describe "stuff" do

  it "should not change i" do
      i = 0
      expect {
        i = 2
      }.to change { i }
  end

  it "should not change i" do
      i = 0
      expect {
        i = 2
      }.to change { i }.from( 0 )
  end


  it "should not change i" do
      i = 0
      expect {
          i = 2
      }.to change { i }.from( 1 )
  end

end

这导致前两个测试通过,最后一个测试失败并显示错误 result should have initially been 1, but was 0
因此,如果我们按原样进行问题测试,您说的是 i should not change from 1因为 i 永远不会是 1,所以这个测试永远不会失败。
it "should not change i" do
    i = 0
    expect {
        i = 2
    }.not_to change { i }.from( 1 ) # i goes from 0 to 2, not 1 to 2, so the test is valid
end

关于ruby-on-rails - rspec not_to 从不按预期行为改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696874/

相关文章:

javascript - Rails 加载所有 JS 文件,而不仅仅是 Controller 特定的文件

ruby-on-rails - 在 Rails 3 中自定义 Rspec 生成器

ruby-on-rails - 如何测试 after_sign_in_path_for(resource)?

ruby - Rspec : expect vs expect with block - what's the difference?

ruby-on-rails - 使用 RSpec 测试 Rails 模型验证日期

ruby-on-rails - 如何使用 pry 调试器检查 rspec 变量

ruby-on-rails-3 - 如何在 rspec 中调用 rake 任务

ruby-on-rails - Rails 选择助手 - 默认选择值,如何?

ruby-on-rails - 模型中的 SystemStackError(堆栈级别太深)

ruby-on-rails-3 - RSpec2 和 capybara