我正在尝试关注Rails Tutorial并且我的rspec失败但是在浏览器中应用程序可以根据需要运行。那是当我登录(在浏览器中)并转到“http:// localhost:3000 / users / 1 / edit”时,此页面打开。本教程中之前的所有rspec都已通过。
我正在使用Rails的“3.1.0.rc4”并在Windows中工作。
失败的规范(来自users_controller_spec.rb):
describe "GET 'edit" do
before(:each) do
@user = Factory(:user)
test_sign_in(@user)
end
it "should be successful" do
get :edit, :id => @user
response.should be_success
end
end
来自spec_helper.rb的test_sign_in代码:
RSpec.configure do |config|
config.mock_with :rspec
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
def test_sign_in(user)
controller.sign_in(user)
end
end
factory.rb的代码
Factory.define :user do |user|
user.name "Mikhail"
user.email "mikleb@yandex.ru"
user.password "123456789a"
user.password_confirmation "123456789a"
end
来自控制台的文字:
Failures:
1) UsersController GET 'edit should be successful
Failure/Error: response.should be_success
expected success? to return true, got false
# ./spec/controllers/users_controller_spec.rb:111:in `block (3 levels) in <
top (required)>'
UPD:在“get:edit,:id =&gt; @user”用户未登录之后。但是正如我在浏览器中写的那样,一切都按照需要运行。怎么可能?
这里是SessionHelper,它包含在ApplicationControlelr中:
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
self.current_user = user
end
def sign_out
cookies.delete(:remember_token)
self.current_user = nil
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@curent_user = user
end
def current_user
@current_user ||= user_from_remember_token
end
def deny_access
redirect_to signin_path, :notice => "Please sign in to access this page."
end
private
def user_from_remember_token
User.authenticate_with_salt(*remember_token)
end
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
end
答案 0 :(得分:2)
您是否倾销response.body
看看Rspec认为它看到了什么?你可以(如果仍然需要,我会忘记)需要按照in this question所述启用render_views
。
用户是否可能没有真正登录,因此网站正在从编辑重定向到登录页面或类似的东西?
另一个警告,我很确定如果HTTP代码是2xx代码(200 ok,201创建等),则rspec仅对be_success
返回true。因此,如果您的控制器正在重定向(302,304等),那么rspec将不会认为请求“已成功”。
在断言前尝试放入puts response.body
,这可能有助于缩小问题范围。