RSpec - 失去职位?

时间:2015-04-27 16:48:10

标签: ruby-on-rails-4 rspec

看起来我正在失去旧金山'在这个例子中的Update测试开始时 - 不知道为什么 - 当我做一个put 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

1 个答案:

答案 0 :(得分:2)

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

快速解决方法是简单地将删除目标定位在拉斯维加斯对象上,因为由于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,直到你真正尝试使用{测试中的{1}}变量。你可以通过简单地添加一个爆炸来解决这个问题,比如flight0