Является ли этот вызов для сна в моей спецификации запроса RSpec действительным? - PullRequest
3 голосов
/ 03 октября 2011

Я нажимаю показать и уничтожить ссылки с Capybara, которые должны быть в первой строке таблицы в таблице сотрудников.Таблица должна быть отсортирована так, чтобы последний измененный сотрудник находился сверху, на основе отметки времени updated_at.

Перед примером должен быть создан действительный сотрудник, который проходит проверку подлинности.Затем в начале примера необходимо создать сотрудника для тестирования. Этот - это сотрудник, который всегда должен быть наверху таблицы, потому что он должен был изменяться совсем недавно.Иногда это так, а иногда нет.Добавление спящего вызова исправляет это, и мне интересно, верно ли это или я ошибся.Я думал, что добавление вызова сна в тесте было плохой вещью.Я также подумал, что если сотрудник проверки подлинности будет создан перед примером, то даже если моя спецификация работает очень быстро, он все равно должен иметь более раннюю отметку времени updated_at.

Макрос проверки подлинности:

module AuthenticationMacros
  def login_confirmed_employee
    # create a valid employee for access
    Factory :devise_confirmed_employee,
      :username => 'confirmed.employee',
      :password => 'password',
      :password_confirmation =>'password'

    # sign in with valid credentials
    visit '/employees/sign_in'
    fill_in 'Username', :with => 'confirmed.employee'
    fill_in 'Password', :with => 'password'
    click_on 'Sign In'
  end
end

Спрашиваемая спецификация запроса:

require 'spec_helper'
include AuthenticationMacros

describe "Employees" do

  before do
    login_confirmed_employee
  end

  # shows employees
  it "shows employees" do
    sleep 1.seconds
    Factory :employee_with_all_attributes,
      :username => 'valid.employee',
      :email => 'valid.employee@example.com',

    visit '/employees'
    within 'tbody tr:first-child td:last-child' do; click_on 'Show', end
    page.should have_content 'valid.employee'
    page.should have_content 'valid.employee@example.com'
  end


  # destroys employees
  it "destroys employees" do
    sleep 1.seconds
    Factory(:employee)
    visit '/employees'
    within 'tbody tr:first-child td:last-child' do; click_on 'Delete', end
    page.should have_content 'Employee was successfully deleted.'
  end
end 

И для хорошей цели вот мой spec_helper:

require 'spork'

Spork.prefork do

  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
  ActiveSupport::Dependencies.clear
  require 'email_spec'
  RSpec.configure do |config|
    config.include EmailSpec::Helpers
    config.include EmailSpec::Matchers
  end
end

Spork.each_run do
  require 'rspec/rails'
  require 'factory_girl_rails'
  require 'capybara/rspec'
  require 'capybara/rails'
  require 'shoulda'

  RSpec.configure do |config|

    config.mock_with :rspec
    config.use_transactional_fixtures = false

    config.before(:suite) do
      DatabaseCleaner.strategy = :truncation
    end

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

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

Иногда я оказываюсь на странице шоу или уничтожаю сотрудника, требующего аутентификацию вместоНапример, сотрудник. Это никогда не произойдет, если я добавлю 1-секундный вызов в спящем режиме.

1 Ответ

2 голосов
/ 03 апреля 2012

Нет, на самом деле это очень плохое решение, потому что увеличивает время выполнения тестов. Вы можете смоделировать вызов метода Time.now, используя одно из следующих решений:

...