RSpec - 输了 post?

RSpec - losing post?

看起来我在这个例子中的更新测试开始时输了 'San Francisco' - 不知道为什么 - 当我在 Post 测试结束时做一个 puts response.body一切正常 - 这是我的 flights_spec.rb:

require 'rails_helper'
require 'spec_helper'
require 'flight'

RSpec.describe FlightsController, type: :controller  do

   render_views
   let(:flight0) { Flight.create(:destination => "Las Vegas") }

      it "Get Test" do
        puts 'Get Test'
        get :index, :format => :json
        puts "Body = " + response.body
        expect(response.body).to include('Las Vegas')
     end

     it "Post Test" do
       puts 'Post Test'
       post :create, :flight => {:destination => "San Francisco"}
       puts "Post status:" + response.status.to_s
       expect(response).to redirect_to(assigns(:flight))
       redirect_to(response.headers['Location'])
       get :index, :format => :json
       puts "Body = " + response.body
       expect(response.body).to include("San Francisco")
    end

    it "Update Test" do
        puts 'Delete Test'
        get :index, :format => :json
        puts "Body = " + response.body
        expect(response.body).to include("San Francisco")
    end 
end

RSpec 假设您编写的每个测试都独立于其他测试。但是,按照您在这里的方式,Update Test 依赖于 Post Test 来创建它需要的数据。 RSpec 自动撤消您在每次测试之间所做的任何更改。您可以将每个 it 块视为将所有内容重置回初始状态。

一个快速的解决方法是简单地将删除瞄准 Las Vegas 对象,因为由于 let 语句:

已经为每个测试重新创建此航班
it "Update Test" do
    puts 'Delete Test'
    get :index, :format => :json
    puts "Body = " + response.body
    expect(response.body).to include("Las Vegas")
    # rest of your test
end 

另外我要注意的是,您可能 运行 遇到 let 语句的问题,因为它是延迟实例化的,这意味着它可能不会真正创建拉斯维加斯 flight 直到您实际上尝试在测试中使用 flight0 变量。你可以通过简单地在末尾添加一个爆炸来解决这个问题,就像这样 let!(:flight_0) {}.