describe User do
it { should have_attached_file(:avatar) }
it { should validate_attachment_presence(:avatar) }
it { should validate_attachment_content_type(:avatar).
allowing('image/png', 'image/gif').
rejecting('text/plain', 'text/xml') }
it { should validate_attachment_size(:avatar).
less_than(2.megabytes) }
end-
-
Save bobanj/3063329 to your computer and use it in GitHub Desktop.
RSpec Matchers
response.should be_valid
response.should_not be_valid
response.should be_success
response.should be_redirect
response.should redirect_to("path/to/action")
response.should redirect_to("http://test.host/path/to/action")
response.should redirect_to(:action => 'list')
response.should render_template('list')
response.should render_template('same_controller/list')
response.should render_template('other_controller/list')
# partials
response.should render_template('_a_partial')
response.should render_template('same_controller/_a_partial')
response.should render_template('other_controller/_a_partial')"path".should route_to(expected) # assumes GET
{ :get => "path" }.should route_to(expected)
{ :put => "path" }.should route_to(expected)
{ "path" }.should_not be_routable # assumes GET
{ :get => "path" }.should_not be_routable
{ :put => "path" }.should_not be_routableresponse.should have_tag("div", "some text")
person_address_tag.should have_tag("input#person_address") # in a helper
response.should have_tag("div#form") do
with_tag("input#person_name[name=?]", "person[name]")
end
response.should have_tag("div#1") do
without_tag("span", "some text that shouldn't be there")
end
response.should include_text("This text will be in the actual string")response.should send_email(*args, &block)actual.should eq(expected) # passes if actual == expected
actual.should == expected # passes if actual == expected
actual.should eql(expected) # passes if actual.eql?(expected)actual.should be(expected) # passes if actual.equal?(expected)
actual.should equal(expected) # passes if actual.equal?(expected)actual.should be > expected
actual.should be >= expected
actual.should be <= expected
actual.should be < expected
actual.should be_within(delta).of(expected)actual.should =~ /expression/
actual.should match(/expression/)actual.should be_an_instance_of(expected)
actual.should be_a_kind_of(expected)actual.should be_true # passes if actual is truthy (not nil or false)
actual.should be_false # passes if actual is falsy (nil or false)
actual.should be_nil # passes if actual is nilexpect { ... }.to raise_error
expect { ... }.to raise_error(ErrorClass)
expect { ... }.to raise_error("message")
expect { ... }.to raise_error(ErrorClass, "message")expect { ... }.to throw_symbol
expect { ... }.to throw_symbol(:symbol)
expect { ... }.to throw_symbol(:symbol, 'value')actual.should be_xxx # passes if actual.xxx?
actual.should have_xxx(:arg) # passes if actual.has_xxx?(:arg)(1..10).should cover(3)actual.should include(expected)
actual.should start_with(expected)
actual.should end_with(expected)[1,2,3].should include(1)
[1,2,3].should include(1, 2)
[1,2,3].should start_with(1)
[1,2,3].should start_with(1,2)
[1,2,3].should end_with(3)
[1,2,3].should end_with(2,3)
{:a => 'b'}.should include(:a => 'b')
"this string".should include("is str")
"this string".should start_with("this")
"this string".should end_with("ring")Matchers to test associations:
describe Post do
it { should belong_to(:user) }
it { should have_many(:tags).through(:taggings) }
end
describe User do
it { should have_many(:posts) }
end
it { should have_and_belong_to_many(:posts) }
it { should_not have_db_column(:admin).of_type(:boolean) }
it { should have_db_column(:salary).
of_type(:decimal).
with_options(:precision => 10, :scale => 2) }
it { should have_db_index(:age) }
it { should have_db_index([:commentable_type, :commentable_id]) }
it { should have_db_index(:ssn).unique(true) }
it { should have_many(:friends) }
it { should have_many(:enemies).through(:friends) }
it { should have_many(:enemies).dependent(:destroy) }
it { should have_one(:god) }
it { should have_readonly_attribute(:password) }Matchers to test validations and mass assignments:
describe Post do
it { should validate_uniqueness_of(:title) }
it { should validate_presence_of(:body).with_message(/wtf/) }
it { should validate_presence_of(:title) }
it { should validate_numericality_of(:user_id) }
it { should validate_acceptance_of(:eula) }
it { should validate_format_of(:name).
with('12345').
with_message(/is not optional/) }
it { should validate_format_of(:name).
not_with('12D45').
with_message(/is not optional/) }
it { should validate_numericality_of(:age) }
# validates_uniqueness_of requires an entry to be in the database already
it "validates uniqueness of title" do
Post.create!(title: "My Awesome Post", body: "whatever")
should validate_uniqueness_of(:title)
end
end
describe User do
it { should_not allow_value("blah").for(:email) }
it { should allow_value("[email protected]").for(:email) }
it { should ensure_inclusion_of(:age).in_range(1..100) }
it { should ensure_exclusion_of(:age).in_range(30..60) }
it { should_not allow_mass_assignment_of(:password) }
end
it { should ensure_length_of(:password).
is_at_least(6).
is_at_most(20) }
it { should ensure_length_of(:name).
is_at_least(3).
with_short_message(/not long enough/) }
it { should ensure_length_of(:ssn).
is_equal_to(9).
with_message(/is invalid/) }Matchers to test common patterns:
describe PostsController, "#show" do
context "for a fictional user" do
before do
get :show, :id => 1
end
it { should assign_to(:user) }
it { should respond_with(:success) }
it { should render_template(:show) }
it { should_not set_the_flash }
end
end
# other examples
it { should assign_to(:user) }
it { should_not assign_to(:user) }
it { should assign_to(:user).with_kind_of(User) }
it { should assign_to(:user).with(@user) }
it { should render_with_layout }
it { should render_with_layout(:special) }
it { should_not render_with_layout }
it { should respond_with(:success) }
it { should respond_with(:redirect) }
it { should respond_with(:missing) }
it { should respond_with(:error) }
it { should respond_with(501) }
it { should respond_with_content_type(:xml) }
it { should respond_with_content_type(:csv) }
it { should respond_with_content_type(:atom) }
it { should respond_with_content_type(:yaml) }
it { should respond_with_content_type(:text) }
it { should respond_with_content_type('application/rss+xml') }
it { should respond_with_content_type(/json/) }
it { should set_session(:message) }
it { should set_session(:user_id).to(@user.id) }
it { should_not set_session(:user_id) }
it { should set_the_flash }
it { should set_the_flash.to("Thank you for placing this order.") }
it { should set_the_flash.to(/created/i) }
it { should set_the_flash.to(/logged in/i).now }
it { should_not set_the_flash }
it { should filter_param(:password) } it { should have_sent_email.with_subject(/is spam$/) }
it { should have_sent_email.from('[email protected]') }
it { should have_sent_email.with_body(/is spam\./) }
it { should have_sent_email.to('[email protected]') }
it { should have_sent_email.with_part('text/html', /HTML spam/) }
it { should have_sent_email.with_subject(/spam/).
from('[email protected]').
with_body(/spam/).
to('[email protected]') }
it {should have_sent_email.to {@user.email} }
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment