msm*_*114 4 ruby-on-rails rspec-rails
所以我在看: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
Run Code Online (Sandbox Code Playgroud)
特别是最后一行: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实际上是什么改变了,Article.count所以这究竟是如何工作的?测试是否会在代码块运行之前看看它们是什么?"prerun "它...比较.by(1)后?
谢谢
Dan*_*orf 10
有两个代码块正在执行.传递给的代码块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)
Run Code Online (Sandbox Code Playgroud)
我会重构你的测试,因为它更容易理解:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4792 次 |
| 最近记录: |