Rspec - ожидается ActiveRecord :: RecordInvalid, но ничего не было поднято? - PullRequest
0 голосов
/ 10 января 2019

Я создаю тесты с использованием rspec и пытаюсь вызвать ошибку «ActiveRecord :: RecordInvalid», но я получаю «ожидаемый ActiveRecord :: RecordInvalid, но ничего не было поднято»

Я довольно новичок в тестировании rspec, и я впервые задаю вопрос о переполнении стека. Таким образом, мой вопрос может быть несовершеннолетним, поэтому я заранее прошу прощения.

class InsiderMailAddress < ActiveRecord::Base

   def self.get_list_by_role(role)
   address = InsiderMailAddress.find_by_role(role)
   end
end


 describe "get list by role" do    
   it "raises error when invalid role is given" do
     expect {
     InsiderMailAddress.get_list_by_role(:role)
   }.to raise_error(ActiveRecord::RecordInvalid)
   end
 end

Ответы [ 2 ]

0 голосов
/ 10 января 2019

вы должны использовать find_by! для повышения ActiveRecord::RecordNotFound исключения.

Только проверки повышают ActiveRecord::InvalidRecord, а не ActiveRecord::RecordNotFound

0 голосов
/ 10 января 2019

Это неправильное исключение.

ActiveRecord::RecordInvalid повышается, когда запись недействительна. Довольно понятно.

class Country < ApplicationRecord
  validates_presence_of :name
end

irb(main):001:0> Country.create
   (0.7ms)  BEGIN
   (0.2ms)  ROLLBACK
=> #<Country id: nil, name: nil, created_at: nil, updated_at: nil>
irb(main):002:0> Country.create!
   (0.3ms)  BEGIN
   (0.4ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
    from (irb):2

Как вы можете видеть, он не поднимается при вызове .create - но когда вы вызываете методы "взрыва" .save! и .create!.

То, что вы можете искать, это ActiveRecord::RecordNotFound.

irb(main):001:0> Country.find(1)
  Country Load (0.5ms)  SELECT  "countries".* FROM "countries" WHERE "countries"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
ActiveRecord::RecordNotFound: Couldn't find Country with 'id'=1
    from (irb):1
irb(main):002:0> Country.find_by(id: 1)
  Country Load (0.9ms)  SELECT  "countries".* FROM "countries" WHERE "countries"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> nil
irb(main):003:0> Country.find_by!(id: 1)
  Country Load (0.7ms)  SELECT  "countries".* FROM "countries" WHERE "countries"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
ActiveRecord::RecordNotFound: Couldn't find Country
    from (irb):3

Как видно из этого примера, он не поднимается на .find_by - скорее он просто возвращает ноль. Если вы хотите вызвать исключение, вам нужно использовать .find_by!. То же самое относится к динамическим искателям .

...