Rspec - 访问法术方法/变量

时间:2012-03-14 12:23:58

标签: ruby-on-rails ruby-on-rails-3 rspec-rails sorcery

尝试为我已编写的代码编写一些测试,以便使用测试驱动开发扩展我的代码。

我有一个控制器,其索引操作调用'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?

4 个答案:

答案 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