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
Другие вопросы по тегам