Тест RSpec проходит индивидуально, не пройдя весь набор - PullRequest
0 голосов
/ 05 апреля 2019

У меня возникла проблема с моим Rails api.

Преступник:

context 'as a publisher' do
  before { create(:invitation_post) }

  it 'shows posts whose invitations are to you' do
    authorise publisher # helper which adds an authentication token to the request headers
    get :index, params: { expand: ['invitation'] }
    expect(json_body[:data].map {|e| e[:invitation][:account] }).to all eq account.id
  end
end

И ошибка (потому что ответ 403):

Failure/Error: expect(json_body[:data].map {|e| e[:invitation][:account] }).to all eq account.id

NoMethodError:
  undefined method `map' for nil:NilClass

Я запустил rspec с --bisect, что помогло мне определить пару примеров, которые я могу запустить, чтобы воспроизвести его, что по крайней мере спасает меня от выполнения ~ 300 других тестов каждый раз.Но другой пример кажется совершенно не связанным с другим контроллером и тестовым файлом.

В своей политике я точно определил точку, в которой он не работает.Я проверяю тип пользователя (происходит наследование одной таблицы) с помощью user.is_a?(Publisher), который должен возвращать true, но в данном конкретном случае это не так.Однако, если я скажу user.class.name == 'Publisher', это вернет истину.

У меня есть p, если пользователь и в тесте, и в политике есть, и они кажутся полностью идентичными.

Дополнительная информация (и я был бы рад поделиться дополнительной информациейпри необходимости):

  • config.use_transactional_fixtures = true - пробовал оба true и false - кажется, не исправить это.
  • Тест данных из FactoryBot (gem "factory_bot_rails", "~> 4.0")
  • Попробовал очистить базу данных в различных точках с помощью DatabaseCleaner, но, похоже, тоже не исправить
  • Политика:
def index?
  user.is_a?(Admin) || user.is_a?(Author) || user.is_a?(Publisher)
end

ТакЯ предполагаю, что я спрашиваю: если пользователь не является издателем, то что это может быть?И что мне нужно сделать, чтобы исправить тест?Любая помощь или свет, который можно было бы пролить, будет высоко ценится!

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

Другой тест от пополам:

it 'returns a list of invitations' do
  get :index
  expect(json_body[:data].count).to eq 4
end

Авторизуйтесьпомощник:

def authorise(user)
  request.headers.merge!({ "Authorization" => JsonWebToken.encode(user_id: user.id) })
end
...