Rspec, несколько утверждений над одним и тем же кодом
Я пытаюсь проверить несколько условий для одного и того же выполнения, в данном случае это просто post( :create , user: user.attributes )
но я хотел бы знать в целом, каков наилучший подход.
Вот полный пример
describe UsersController do
describe 'CRUDL' do
describe 'create' do
let(:user) { User.new(username: "created") }
let(:response) { post( :create , user: user.attributes ) }
it 'should respond with created(201) http message' do
response.code.should == "201"
end
it 'should increment total users count' do
expect{ response }.to change{User.count}.by(1)
end
end
end
expect{ response }.to change{User.count}.by(1)
часть не кажется правильной. Каков был бы правильный подход для проверки множества утверждений в рамках одного и того же выполнения кода?
1 ответ
Предупреждение: если вы используете rspec-rails, уже есть response
метод добавить в пример объекта. Ямочный ремонт let
на вершине может привести к трудностям для отладки ошибок.
С этим, как говорится, нет ничего плохого в этих тестах. Вы должны тестировать только одну вещь в спецификации, которой вы являетесь. expect{}.to change{}
часть может показаться странным, потому что ваш let(:response)
это и действие, которое вы хотите проверить, и хранение объекта ответа.
Это может иметь более интуитивный смысл иметь что-то вроде:
describe 'CRUDL' do
context 'creating a user' do
let(:normal_user) { User.new(username: "created") }
def create_user(user)
post( :create , user: user.attributes )
end
it 'responds with created(201) http message' do
create_user normal_user
expect(response.code).to eq '201'
end
it 'creates the user' do
expect{ create_user normal_user }.to change{User.count}.by(1)
end
end
end