2013-07-06 2 views
0

Я пытаюсь проверить несколько условий за одно и то же выполнение, в данном случае это всего лишь post(:create , user: user.attributes), но я хотел бы знать, в общем, что лучший подход.Rspec, несколько утверждений по одному и тому же коду

Вот полный пример

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) часть не кажется правильным. Каков был бы правильный подход для проверки многих утверждений по сравнению с тем же самым выполнением кода?

+0

при написании спецификаций, связанных с созданием объектов в БД, я предпочитаю использовать несколько утверждений. Это можно применить здесь. Кстати, вы могли бы ускорить работу, если вы использовали заглушки. – apneadiving

ответ

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 
+0

Можете ли вы объяснить немного больше своего первого абзаца? –

+1

Это явно не указано в документации, но если вы посмотрите спецификации: https://www.relishapp.com/rspec/rspec-rails/v/2-14/docs/controller-specs, вы можете видеть, что они просто используют 'response', не настраивая его ни на что. Это то, что rspec-rails управляет за кулисами. –

Смежные вопросы