RSpec测试单独通过,整个套件均未通过

时间:2019-04-05 10:54:10

标签: ruby-on-rails ruby api rspec pundit

我的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',则返回true。

我已经p在测试和策略中都对用户进行了验证,它们看起来是完全相同的。

其他信息(我很乐意在必要时分享更多信息)

  • config.use_transactional_fixtures = true-尝试过truefalse-似乎无法解决。
  • 测试来自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

0 个答案:

没有答案