Rspec заводская девушка выпуска - PullRequest
1 голос
/ 26 марта 2012

У меня тест на rspec / factory girl, где я не могу пройти тест.

Я использую devise, где current_user вызывает текущую вошедшую в систему модель пользователя.

Iможет загрузить тестовую консоль и набрать

u = Factory(:user)
u.company

И это вернет действительную компанию, но по какой-то причине при вызове rspec current_user.company возвращает nil.

Есть идеи?

Контроллер

class CompaniesController < ApplicationController
   before_filter :authenticate_user!

   def show
     @company = current_user.company
   end
end

Модель

class User < ActiveRecord::Base
  validates_uniqueness_of :email, :case_sensitive => false

  has_one :company
end

Заводская

Factory.define :company do |f|
  f.name 'Test Company'
end

Factory.sequence(:email) do |n| 
  "person#{n}@example.com"
end

Factory.define :user do |f|
  f.name 'Test User'
  f.email {Factory.next :email}
  f.password 'password'
  f.company Factory(:company)
end

Тест

describe CompaniesController do
  before(:each) do
    @user = Factory(:user)
    sign_in @user
  end

  describe "GET show" do
    before do
      get :show
    end

    it "should find the users company" do
      assigns(:company).should be_a(Company)
    end
  end
end

Spec Helper

RSpec.configure do |config|      
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.infer_base_class_for_anonymous_controllers = false
end

ТестРезультат

Failures:

  1) CompaniesController GET show should find the users company
     Failure/Error: assigns(:company).should be_a(Company)
       expected nil to be a kind of Company(id: integer, name: string, user_id: integer, created_at: datetime, updated_at: datetime)
       # ./spec/controllers/companies_controller_spec.rb:21:in `block (3 levels) in <top (required)>'

РЕДАКТИРОВАТЬ

Я удалил f.company = Factory (: company) в файле фабрики.И сделал мой контроллер spec этим

требует 'spec_helper'

describe CompaniesController do     
  let(:current_user) { Factory(:user) }

  before(:each) do    
    sign_in current_user

    current_user.company = Factory(:company)
    current_user.save
  end

  describe "GET show" do
    before do
      get :show
    end

    it "should find the users company" do
      current_user.should respond_to(:company)
      assigns(:company).should == current_user.company
    end
  end
end

Ответы [ 3 ]

1 голос
/ 26 марта 2012

Я не уверен, но я полагаю, что метод assign (: company) проверяет переменную экземпляра @company, которая явно не существует.Попробуйте поместить @company = @user.company в свой блок before(:each) или протестируйте его другим способом, например;

it "should find the users company" do
  @user.should respond_to(:company)
end

Я считаю, что это должно быть сделано!

0 голосов
/ 14 апреля 2012

Я думаю, что главное, чего вам не хватало, - это установить ассоциацию на вашем заводе. Исходя из исходного примера:

Factory.define :user do |f|
  f.name 'Test User'
  f.email {Factory.next :email}
  f.password 'password'
  f.association :company, factory => :company
end

Затем, когда вы создаете пользователя, он создает компанию и заполняет user.company_id правильным идентификатором.

См. «Ассоциации» в Factory Girl Getting Started документ.

0 голосов
/ 27 марта 2012

Определить объект Let для компании в вашем контроллере rspec.

describe CompaniesController do
  describe "authorizations" do
   before(:each) do
    let(:company) { Factory :company }
    let(:user_admin) { Factory(:user) }
   end

   it "should redirect" do
    sign_in(user_admin)
    get :show
   end

   it "should find the users company" do
     assigns(:company).should be_a(company)
   end
 end
end

Можете ли вы попробовать с приведенными выше спецификациями?

...