ruby-on-rails - 具有相同代码的 2 个测试之间的 Rspec 不一致结果

标签 ruby-on-rails testing rspec

我有一个模型规范抛出意外错误(没有正确构建对象)。 当我将相同的代码移到之前的测试中时,它运行顺利。

这是有问题的期望:

expect(title.full_title.length).to be <= 140

将行添加到第一个测试时,它通过了,而第二个测试失败了:

  describe "generates a title" do
    let(:collection) { FactoryBot.create(:collection) }
    let(:items) { FactoryBot.create_list(:item, 10, collection: collection, chosen: true) }
    let(:title) { Title.create_title(collection) }

context "happy path" do
  it "assigns keywords by score" do
    array = []
    items.each do |i|
      array << [i.search.term, i.search.score]
    end
    array.sort! { |a, b| a[1] <=> b[1] }
    split_title = title.full_title.split(', ')
    remaining_chars = 140
    i = 0

    split_title.each do |s|
      if remaining_chars - s.length >= 0
        expect(s).to eq(array[i][0])
        i +=  1
        remaining_chars -= s.length
      end

      expect(title.full_title.length).to be <= 140
    end
  end

  it "does not exceed 140 characters" do
    expect(title.full_title.length).to be <= 140
  end
end

这是错误信息,它没有创建对象:

  1) Title generates a title happy path does not exceed 140 characters
     Failure/Error: remaining_chars = 140 - keywords[0].length

     NoMethodError:
       undefined method `length' for nil:NilClass

TIA!

最佳答案

希望不大,但如果我今天运气好的话,让我们试试吧。

猜测:Title.full_title实现(你没有分享)在某种程度上取决于 Item 的存在与用于初始化 Title 的集合相关对象。

如果该假设是正确的,则不同的行为来自 let 的惰性性质.

在第一个it , 你实际上调用 items (例如 items.each )所以 let(:items)被评估,数据库中的行被创建并且title.full_title不返回 nil .

有几种可能的修复方法:

  1. 改进 full_title 的实现总是返回字符串。
  2. 调用items在第二种情况之前

it "does not exceed 140 characters" do items expect(title.full_title.length).to be <= 140 end

  1. 使用let!(:items)这是立即评估的(不是懒惰的)

关于ruby-on-rails - 具有相同代码的 2 个测试之间的 Rspec 不一致结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428748/

相关文章:

testing - 在开发容器运行时运行 docker 集成测试容器

python - 在 setUpClass 中访问 Django 测试客户端

ruby-on-rails - 数据库迁移到 heroku 不起作用

javascript - capybara-webkit 无法执行 javascript(minitest 系统测试)

ruby-on-rails - 如何使用 globalize 按翻译字段对查询进行排序

.net - 在 .net 应用程序中使用 Cucumber 和 rspec 的教程

ruby-on-rails - 规范中引用 ActiveRecord::Relation 对象的约定

ruby-on-rails - 我应该在哪里放置 RSpec 测试的种子数据?

performance - 负载测试软件

ruby-on-rails - 使用 RSpec 测试模型时出现错误 "undefined method ` <' for nil:NilClass"。