RSpec.describe Course,type::modeldo
it { is_expected.to validate_presence_of(:title)}
it { is_expected.to belong_to(:user)}end
三. 使用
1. 测试controller
# spec/requests/courses_spec.rbrequire'rails_helper'
RSpec.describe 'Courses',type::requestdo
describe 'GET /index'do
it 'assigns @courses'do
course1 = create(:course)
course2 = create(:course)
get '/courses'
expect(assigns[:courses]).to eq([course1, course2])end
it 'render template'do
get '/courses'
expect(response).to render_template('courses/index')endend
describe 'GET /show'do
let(:course){ create(:course)}
it 'assign @course'do
get "/courses/#{course.id}"
expect(assigns[:course]).to eq(course)end
it 'render show template'do
get "/courses/#{course.id}"
expect(response).to render_template('courses/show')endend
describe 'GET /new'do
it 'assign @course'do
get '/courses/new'
expect(assigns(:course)).to be_a_new(Course)end
it 'render template'do
get '/courses/new'
expect(response).to render_template('courses/new')endend
describe 'POST /create'do
let(:course){ build(:course)}
context 'when course have title'do
it 'create a new record'do
expect do
post '/courses',params:{title: course.title,description: course.description }end.to change { Course.count }.by(1)end
it 'redirect to index page'do
post '/courses',params:{title: course.title,description: course.description }
expect(response).to redirect_to courses_path
endend
context "when course doesn't have tile"do
it 'create a new record'do
expect do
post '/courses',params:{description: course.description }end.to change { Course.count }.by(0)end
it 'redirect to index page'do
post '/courses',params:{description: course.description }
expect(response).to render_template 'courses/new'endendend
describe 'GET /edit'do
it 'assign @course'do
course = create(:course)
get "/courses/#{course.id}/edit"
expect(assigns[:course]).to eq(course)end
it 'render edit template'do
course = create(:course)
get "/courses/#{course.id}/edit"
expect(response).to render_template('courses/edit')endend
describe 'PUT /course/:id'do
let!(:course){ create(:course)}
context 'when the course has title'do
it 'assign @course'do
put "/courses/#{course.id}",params:{course:{title: course.title }}
expect(assigns[:course]).to eq(course)end
it 'change value'do
put "/courses/#{course.id}",params:{course:{title:'course.title'}}
expect(assigns[:course].title).to eq('course.title')end
it 'redirect to show page'do
put "/courses/#{course.id}",params:{course:{title:'course.title'}}
expect(response).to redirect_to course_path(course)endend
context "when the course dosen't has title"do
it 'doesn\'t change value'do
put "/courses/#{course.id}",params:{course:{title:""}}
course.reload # 注意reload 取更新后的course
expect(assigns[:course].title).not_to eq(course.title)end
it 'render edit page'do
put "/courses/#{course.id}",params:{course:{title:''}}
expect(response).to render_template 'courses/edit'endendend
describe 'DELETE /course/:id'do
let!(:course){ create(:course)}
it 'deletes a course'do
expect do
delete "/courses/#{course.id}"end.to change { Course.count }.by(-1)end
it 'redirect to index page'do
delete "/courses/#{course.id}"
expect(response).to redirect_to courses_path
endendend
2. 测试route
# spec/routing/homepage_spec.rbrequire"rails_helper"
RSpec.describe "Homepage"do
it "route root path to course # index"do
expect(get:"/").to route_to(controller:"courses",action:"index")endend