Ruby on rails Rspec,同一代码上的多个断言

Ruby on rails Rspec,同一代码上的多个断言,ruby-on-rails,rspec,rspec-rails,reusability,Ruby On Rails,Rspec,Rspec Rails,Reusability,我试图在同一执行中检查多个条件,在本例中,这只是一个post(:create,user:user.attributes),但我想知道一般情况下最好的方法是什么 下面是完整的示例 describe UsersController do describe 'CRUDL' do describe 'create' do let(:user) { User.new(username: "created") } let(:response) { post( :cr

我试图在同一执行中检查多个条件,在本例中,这只是一个
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}.通过(1)更改{User.count}.by
部分似乎不正确。在同一代码执行过程中测试多个断言的正确方法是什么?

一句警告的话,如果您使用的是rspec rails,那么示例对象中已经添加了一个
响应
方法。在顶部修补自定义
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

在编写涉及在db中创建对象的规范时,我倾向于使用多个断言。这可以在这里应用。顺便说一句,如果你使用stubsCan,你可以加快速度。你可以解释一下你的第一段内容吗?文档中没有明确说明,但是如果你查看规范:你可以看到他们只使用
响应
,而不进行任何设置。这是RSpecRails在幕后管理的东西。