看起来我正在失去旧金山'在这个例子中的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
答案 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
。