- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
了解后shoulda-matchers通过回答 another StackOverflow question on attribute accessibility tests (并且认为它们非常棒),我决定尝试重构我在 The Rails Tutorial 中所做的模型测试试图使它们更加简洁和彻底。得益于模块文档 Shoulda::Matchers::ActiveRecord
的一些启发,我做到了这一点。和 Shoulda::Matchers::ActiveModel
,以及 this StackOverflow answer关于在模型中构建应该测试。但是,仍有一些事情我不确定,我想知道如何才能使这些测试变得更好。
我将使用 Rails 教程中的用户规范作为我的示例,因为它是最详细的,并且涵盖了许多可以改进的领域。以下代码示例已从原始 user_spec.rb 更改。 , 并替换代码直到 describe "micropost associations"
线。该规范针对 user.rb 进行测试型号,其工厂定义在factories.rb .
规范/模型/user_spec.rb
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# name :string(255)
# email :string(255)
# created_at :datetime not null
# updated_at :datetime not null
# password_digest :string(255)
# remember_token :string(255)
# admin :boolean default(FALSE)
#
# Indexes
#
# index_users_on_email (email) UNIQUE
# index_users_on_remember_token (remember_token)
#
require 'spec_helper'
describe User do
let(:user) { FactoryGirl.create(:user) }
subject { user }
describe "database schema" do
it { should have_db_column(:id).of_type(:integer)
.with_options(null: false) }
it { should have_db_column(:name).of_type(:string) }
it { should have_db_column(:email).of_type(:string) }
it { should have_db_column(:created_at).of_type(:datetime)
.with_options(null: false) }
it { should have_db_column(:updated_at).of_type(:datetime)
.with_options(null: false) }
it { should have_db_column(:password_digest).of_type(:string) }
it { should have_db_column(:remember_token).of_type(:string) }
it { should have_db_column(:admin).of_type(:boolean)
.with_options(default: false) }
it { should have_db_index(:email).unique(true) }
it { should have_db_index(:remember_token) }
end
describe "associations" do
it { should have_many(:microposts).dependent(:destroy) }
it { should have_many(:relationships).dependent(:destroy) }
it { should have_many(:followed_users).through(:relationships) }
it { should have_many(:reverse_relationships).class_name("Relationship")
.dependent(:destroy) }
it { should have_many(:followers).through(:reverse_relationships) }
end
describe "model attributes" do
it { should respond_to(:name) }
it { should respond_to(:email) }
it { should respond_to(:password_digest) }
it { should respond_to(:remember_token) }
it { should respond_to(:admin) }
it { should respond_to(:microposts) }
it { should respond_to(:relationships) }
it { should respond_to(:followed_users) }
it { should respond_to(:reverse_relationships) }
it { should respond_to(:followers) }
end
describe "virtual attributes and methods from has_secure_password" do
it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }
it { should respond_to(:authenticate) }
end
describe "accessible attributes" do
it { should_not allow_mass_assignment_of(:password_digest) }
it { should_not allow_mass_assignment_of(:remember_token) }
it { should_not allow_mass_assignment_of(:admin) }
end
describe "instance methods" do
it { should respond_to(:feed) }
it { should respond_to(:following?) }
it { should respond_to(:follow!) }
it { should respond_to(:unfollow!) }
end
describe "initial state" do
it { should be_valid }
it { should_not be_admin }
its(:remember_token) { should_not be_blank }
its(:email) { should_not =~ /\p{Upper}/ }
end
describe "validations" do
context "for name" do
it { should validate_presence_of(:name) }
it { should_not allow_value(" ").for(:name) }
it { should ensure_length_of(:name).is_at_most(50) }
end
context "for email" do
it { should validate_presence_of(:email) }
it { should_not allow_value(" ").for(:email) }
it { should validate_uniqueness_of(:email).case_insensitive }
context "when email format is invalid" do
addresses = %w[user@foo,com user_at_foo.org example.user@foo.]
addresses.each do |invalid_address|
it { should_not allow_value(invalid_address).for(:email) }
end
end
context "when email format is valid" do
addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
addresses.each do |valid_address|
it { should allow_value(valid_address).for(:email) }
end
end
end
context "for password" do
it { should ensure_length_of(:password).is_at_least(6) }
it { should_not allow_value(" ").for(:password) }
context "when password doesn't match confirmation" do
it { should_not allow_value("mismatch").for(:password) }
end
end
context "for password_confirmation" do
it { should validate_presence_of(:password_confirmation) }
end
end
# ...
end
Shoulda::Matchers::ActiveRecord
的存在是合理的。模块?也许只有重要的指标值得测试......? should have_many
"associations"
下的测试替换它们对应的should respond_to
"model attributes"
下的测试?我不知道 should have_many
测试只是寻找相关的has_many
在模型文件中声明或实际执行与 should respond_to
相同的功能. 最佳答案
1) Shoulda::Matchers::ActiveRecord 模块中包含的不仅仅是列和索引匹配器。我会在 included classes一点点,看看你能找到什么。这就是 have_many
, belong_to
等来自。不过,作为记录,我认为其中的大部分内容几乎没有值(value)。
2) 是的,have_many
等宏测试比模型是否响应方法要多得多。来自 source code ,您可以准确地看到它正在测试什么:
def matches?(subject)
@subject = subject
association_exists? &&
macro_correct? &&
foreign_key_exists? &&
through_association_valid? &&
dependent_correct? &&
class_name_correct? &&
order_correct? &&
conditions_correct? &&
join_table_exists? &&
validate_correct?
end
respond_to
测试并用有值(value)的测试替换它们。当有人查看您的测试时,他们应该能够理解该类的公共(public) API。当我看到您的对象对“跟随?”之类的内容做出响应时,我可以做出假设,但并不真正知道这意味着什么。需要争论吗?它是否返回 bool 值?对象是跟随某物还是某物跟随该对象?
关于ruby-on-rails - 使用 shoulda 重构 Rails 模型上的 rspec 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12031265/
我遇到了一个问题,我的模型上的自定义验证导致所有 shoulda 验证失败。 本质上: class User birthday errors.add(:birthday, "Some s
请帮忙: 我想用 minitest 来使用 shoulda。 这是我得到的异常: NoMethodError: undefined method `run_teardown_hooks' for #:
请帮忙: 我想用 minitest 来使用 shoulda。 这是我得到的异常: NoMethodError: undefined method `run_teardown_hooks' for #:
我有一个 User 模型,它有一个 items 的子关联。项目的 :name 对用户来说应该是唯一的,但它应该允许不同的用户拥有同名的项目。 Item 模型当前设置为: class Item < Ap
在 Rails Test Prescriptions 一书中(b10.0,第 176 页),有如下所示的单行断言示例: 应该“成功”{ assert_response :success } 这对我来说
我是单元测试领域的新手;我现在只使用单元测试大约 2 个月。当我在 Ruby 中进行单元测试时,我目前遵循 TDD 风格并使用 Test::Unit::TestCase。我还阅读了 RSpec 以及它
我正在使用一些Shoulda rspec匹配器来测试我的模型,其中之一是: describe Issue do it { should_not allow_value("test").for(:p
我正在尝试使用 rspec 和 shoulda 匹配器作为我的新测试框架,但我对如何获得 should validate_uniqueness_of(:attribute) 感到有些困惑。测试通过。这
我使用带有 shoulda-matcher 的 rspec-rails 来测试我的模型。这是代码: user_ticket.rb class UserTicket < ActiveRecord::Ba
使用 shoulda-matchers 的正确格式是什么?和 RSpec 的新 expect syntax ? 最佳答案 虽然人们当然可以将 shoulda-matchers 与新的期望语法一起使用,
这是我的: context "Create ingredient from string" do context "1 cups butter" do setup
用较小的代码示例再次问这个问题: # this is a dummy shoulda macro that creates a context def self.macro_context
我对模型的属性进行了以下验证: validates :on_ride_photo, presence: true, inclusion: { in: [true, false] } 然后我有以
我在类(class)中遇到以下属性问题。我也有一个在数据库级别强制执行的日期属性,存在为真: 验证 :date, presence: true 除此之外,我需要为以下两个属性强制组合唯一性 valid
我正在尝试让整个设置在我的 Mac 上与 Autotest/Growl/Shoulda 一起工作,以测试我正在为 Authlogic 开发的 gem。 .我过去经常使用 RSpec,但想切换到 Sho
我的 avatar_parts_spec.rb 中有一个 shoulda 匹配器,但我无法让它通过: 测试: require 'rails_helper' RSpec.describe AvatarP
我有一个模型,该模型在数据库级别具有唯一索引,并且模型验证检查范围为多列的唯一性。 # db level add_index :table1, %i[fk_belongs_to_id col1 col
在我的 device 模型中,我有 enum device_type: { ios: 1 , android: 2 } validates :device_type, presence: true,
我有一个自定义验证器(位于 app/validators/uri_validator.rb)用于: validates :link, uri: true 如何在我的规范中指定它? 理想情况下,我希望进
我有以下 Rspec 测试: describe Productlimit do before(:each) do @productlimit = Factory.create(:produ
我是一名优秀的程序员,十分优秀!