我尝试测试下面的登录方法,但似乎没有将data_provider_user保存到数据库中。我已经使用调试器进行了检查,它完全正常工作,直到它离开方法并返回到rspec代码,如下所示。在使用.valid保存后,我还检查了对象是否有效?而且我有点迷失了!
def login
require 'TwitterOauth'
@data_provider_user = DataProviderUser.find(params[:id])
if @data_provider_user.twitter?
@request_token = TwitterOauth.request_url
@data_provider_user.access_token = @request_token.token
@data_provider_user.oauth_token_secret = @request_token.secret
if @data_provider_user.save
debugger
redirect_to @request_token.authorize_url
end
end
end
测试:
it "should update the tokens" do
require 'TwitterOauth'
TwitterOauth.stub(:request_url).and_return(@token)
debugger
get :login, {id: @data_provider_user.id}
debugger
@data_provider_user.access_token.should_not eq(nil)
@data_provider_user.oauth_token_secret.should_not eq(nil)
end
调试器输出:
#<DataProviderUser id: 84, user_id: 63, data_provider_id: 63, username: nil, password: nil, created_at: "2013-02-19 15:21:59", updated_at: "2013-02-19 15:21:59", access_token: nil, update_frequency: nil, oauth_token_secret: nil>
#<DataProviderUser id: 84, user_id: 63, data_provider_id: 63, username: nil, password: nil, created_at: "2013-02-19 15:21:59", updated_at: "2013-02-19 15:22:12", access_token: "186553918-sEAEO2fcvtyO1x99eH4Q4XwVcOYatODCQ5f1TwqD", update_frequency: nil, oauth_token_secret: "gLw2PtUyTZfxIan1gJBnbP7icboXbi98KlUoOn7ycVs">
#<DataProviderUser id: 84, user_id: 63, data_provider_id: 63, username: nil, password: nil, created_at: "2013-02-19 15:21:59", updated_at: "2013-02-19 15:21:59", access_token: nil, update_frequency: nil, oauth_token_secret: nil>
任何帮助将不胜感激!!
------更新-------
代码实际上没有任何问题,问题是rspec没有及时重新加载它。解决这个问题的一种方法是使用:
@data_provider_user.reload
手中的刷新对象,相应地更新值。
答案 0 :(得分:4)
代码实际上没有任何问题,问题是rspec没有及时重新加载它。解决这个问题的一种方法是使用:
@data_provider_user.reload
在手之前刷新对象,相应地更新值。
答案 1 :(得分:0)
您确定要查看正确的数据库吗?当你进行测试时,它可能会myapp_test
(myapp就是你所谓的应用程序)。您可能正在查看myapp_development
数据库。
如果您通过rails db
访问数据库,那么您可能会进入开发数据库。如果您使用的是MySQL,可以查看select database();
。如果要检查测试数据库,请使用RAILS_ENV=test rails db
。同样,您可以使用select语句来验证您是否在正确的数据库中。
答案 2 :(得分:0)
在spec / rails_helper.rb
将 false 设置为 use_transactional_fixtures :
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = false