0

在我的系统中,我有一个用户拥有一家公司,该公司拥有多个帐户。
用户使用 Devise 登录系统,并在 CompaniesController 中设置了一个名为 selected_company 的虚拟属性。
我想在这种情况下在 AccountsController 中进行多个测试。
我有这个代码来登录用户,这个代码运行良好:

before :each do
  @user = create(:user)
  @user.confirm!
  sign_in @user
end  

但我必须有一个特定的上下文,我试图将其编码为:

context 'when user already selected a company' do
  before :each do
    @company = create(:company)
    @account = create(:account)
    @company.accounts << @account
    @user.selected_company = @company
  end

  it "GET #index must assings @accounts with selected_company.accounts" do
    get :index
    expect(assigns(accounts)).to match_array [@account]
  end
end

但是这段代码不起作用,当我运行它时,我得到了这个错误:

undefined method `accounts' for nil:NilClass

我的 AccountsController#index 只有这个代码:

def index
  @accounts = current_user.selected_company.accounts
end

我是 rspec 和 TDD 的新手,我有时间测试我想要的所有东西,我想测试所有东西来练习 rspec。
我不知道这是否是测试这些东西的最佳方法,所以我愿意接受建议。

4

3 回答 3

0

用。。。来代替:

expect(assigns(:accounts)).to match_array [@accounts]

请注意,:accounts而不仅仅是account.
另外,正如我所见,您@accounts的规范中没有。也请声明。:)

于 2013-04-29T17:21:47.623 回答
0

可能您没有保存 selected_company 并且当您在控制器上调用它时它返回 nil。

@user.save在设置 selected_company 后尝试保存:

context 'when user already selected a company' do
  before :each do
    @company = create(:company)
    @account = create(:account)
    @company.accounts << @account
    @user.selected_company = @company
    @user.save
  end

  it "GET #index must assings @accounts with selected_company.accounts" do
    get :index
    expect(assigns(accounts)).to match_array [@account]
  end
end

希望能帮到你。

于 2013-04-29T20:30:09.767 回答
0

最后,我发现了问题!
我将before声明更改为:

before :each do
  @company = create(:company)
  @account = create(:account)
  @company.accounts << @account
  controller.current_user.selected_company = @company
end

并在期望方法中更改assigns(accounts)assings(:accounts)(带符号)。

于 2013-04-29T21:14:26.200 回答