代码之家  ›  专栏  ›  技术社区  ›  msmith1114

rspec“count”更改?

  •  3
  • msmith1114  · 技术社区  · 6 年前

    所以我在看: https://rubyplus.com/articles/1491-Basic-TDD-in-Rails-Writing-Validation-Tests-for-the-Model

    只是看到了测试技术,我看到了:

    require 'rails_helper'
    
    describe Article, type: :model do
      it 'is valid if title and description fields have value' do
        expect do
          article = Article.new(title: 'test', description: 'test')
          article.save
        end.to change{Article.count}.by(1)
      end
    end
    

    特别是最后一行: end.to change{Article.count}.by(1) . 从阅读 https://relishapp.com/rspec/rspec-expectations/v/3-7/docs/built-in-matchers/change-matcher

    它特别指出:

    更改匹配器用于指定代码块更改 一些易变的状态。您可以使用 两种形式:

    这是有道理的。但是在测试 Article.count 在代码块中,实际上没有“做”任何事情 article.save 是什么改变了 物品计数 那么这到底是如何工作的呢?测试是否在运行前查看代码块中的内容并“预运行”…比较 .by(1) 之后?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  9
  •   Daniel Westendorf    6 年前

    有两个代码块正在执行。传递给的代码块 expect ,以及传递给 change . 这才是真正发生的,在伪代码中。

    difference = 1
    initial_count = Article.count
    
    article = Article.new(title: 'test', description: 'test')
    article.save
    
    final_count = Article.count
    
    expect(final_count - initial_count).to eq(difference)
    

    我将重构您的测试,使其更易于执行以下操作:

    require 'rails_helper'
    
    describe Article, type: :model do
      let(:create_article) { Article.create(title: 'test', description: 'test') }
    
      it 'is valid if title and description fields have value' do
        expect { create_article }.to change { Article.count }.by(1)
      end
    end