尝试为我已编写的代码编写一些测试,以便使用测试驱动开发扩展我的代码。
我有一个控制器,其索引操作调用'user_info'方法,该方法只是依赖于Sorcery的current_user变量收集一些实例变量。例如:
def user_info
@current_A = current_user.a
@current_B = current_user.b
end
def index
user_info
// rest of the method goes here
end
我开始使用rspec编写一些测试,只是为了感受一下测试这个代码库。我的控制器规格非常基本,看起来像这样:
describe MyController do
describe "GET 'index'" do
get 'index'
response.should be_success
end
end
但是,当我尝试运行此规范时出现以下错误: NoMethodError:未定义的方法'a'表示false:FalseClass
首先,如何让我的规范识别出Sorcery方法current_user?而且,出于好奇,为什么current_user被标记为FalseClass的一个实例?如果它没有调用Sorcery方法,(并且我没有在我的代码中的任何其他位置定义current_user),它是否应该显示为nil?
答案 0 :(得分:3)
要使用法术测试助手,您需要在spec_helper.rb
中使用以下几行。
以下内容需要在Rspec.configure块中:
RSpec.configure do |config|
config.include Sorcery::TestHelpers::Rails
end
完成此操作后,您可以使用Sorcery测试助手。对于Controller测试,您可以在测试中添加以下内容。
@user = either a fixture or a factory to define the user
login_user
如果您不想指定@user
,可以传递参数。
login_user(fixture or factory definition)
登录后,current_user
应该可用于您的测试。
logout_user
也可用。
有关设置用户工具以使用login_user
帮助程序的信息,请参阅Sorcery Wiki。
答案 1 :(得分:0)
理查德,问题可能是你没有current_user。
为此,您需要模拟登录过程。
你可以使用控制器规范来做到这一点,但我在这里没有一个很好的例子。我正在编写关于现有代码的规范,就像你一样,而且使用请求规范也是有意义的。
我也没有一个巫术(我应该!!)我在这里使用Capybara来填写表格。不过,以下是我的规范:
(此处:帐户与:用户相同)
context "when logged in" do
before :each do
@account = Factory.create(:account)
@current_game = Factory(:game_stat)
visit login_path
fill_in 'Username or Email Address', :with => @account.email
fill_in 'Password', :with => @account.password
click_button('Log in')
端
所以工厂是另一回事,我看起来像这样:
Factory.define :account do |f|
f.sequence(:username) { |n| "ecj#{n}" }
f.sequence(:email) { |n| "ecj#{n}@edjones.com" }
f.password "secret"
f.password_confirmation {|u| u.password }
端
您不必使用工厂,但确实需要建立该会话并建立current_user。
答案 2 :(得分:0)
重要的一点是确保在创建后激活用户,如果您使用的是:Sorcery的:user_activation子模块。
所以,如果你正在使用制作宝石,那就像,
Fabricator(:properly_activated_user, :from => :user) do
after_create { |user| user.activate! }
end
答案 3 :(得分:0)
正如@nmott所说,你需要做两件事:
1)使用以下方法注册文本助手方法:
RSpec.configure do |config|
config.include Sorcery::TestHelpers::Rails
end
2)在您的示例中,通过current_user
访问controller.current_user
:
login_user(user)
expect(controller.current_user).to be_present