2

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

我有一个控制器,其索引操作调用“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: undefined method 'a' for false:FalseClass

首先,如何让我的规范识别 Sorcery 方法 current_user?而且,出于好奇,为什么 current_user 被标记为 FalseClass 的实例?如果它没有调用 Sorcery 方法(并且我没有在代码中的其他任何地方定义 current_user),它不应该显示为 nil 吗?

4

4 回答 4

4

要使用魔法测试助手,您需要在spec_helper.rb.

以下内容需要在 Rspec.configure 块中:

RSpec.configure do |config|
  config.include Sorcery::TestHelpers::Rails
end

完成此操作后,您可以使用 Sorcery 测试助手。对于控制器测试,您可以将以下内容添加到您的测试中。

@user = either a fixture or a factory to define the user
login_user

如果您不想指定@user,可以传递一个参数。

login_user(fixture or factory definition)

登录后current_user,您的测试应该可以使用。

logout_user也可用。

请参阅Sorcery Wiki以获取有关设置用户夹具以与login_user助手一起使用的信息。

于 2012-03-30T12:08:06.920 回答
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
于 2013-12-01T16:12:44.650 回答
0

理查德,问题很可能是你没有 current_user。

为此,您需要模拟登录过程。

您可以使用控制器规范来做到这一点,但我这里没有一个很好的例子。我像你一样在现有代码上编写规范,而使用请求规范是有意义的。

我也没有一个用于巫术的(我应该!!),我在这里使用 Capybara 填写表格。不过,这就是我的规范的样子:

(这里 :account 与 :user 相同)

 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。

于 2012-03-14T13:29:45.037 回答
0

如果您使用 Sorcery 的 :user_activation 子模块,重要的一点是确保用户在创建后被激活。

所以,如果你使用的是制造宝石,那看起来像,

Fabricator(:properly_activated_user, :from => :user) do
  after_create { |user| user.activate! }
end
于 2013-05-18T00:44:29.053 回答