rspec не уничтожает записи и не проходит тест - PullRequest
0 голосов
/ 05 октября 2018

Я в процессе обновления устаревшего проекта до rails 5.0, и некоторые тесты не пройдены.У меня есть следующий тест:

describe ItemRun do
  describe "#item_template" do
    context "with an item template that has been deleted" do
      let(:item_template) { ItemTemplate.create! title: "Hello" }
      let!(:item_run) { item_template.item_runs.create! title: "Testing" }

      before do
        item_template.update_attributes(deleted: true)
      end

      it "responds to :title" do
        expect(item_run.item_template.title).to eq ""
      end
    end
  end
end

Ошибка сообщает следующее:

ItemRun#item_template with a item template that has been deleted responds to :title
     Failure/Error: expect(item_run.item_template.title).to eq ""

       expected: ""
            got: "Hello"

       (compared using ==)
     # ./spec/models/item_run_spec.rb:14:in `block (4 levels) in <top (required)>'

Я также пытался item_template.destroy, но получил тот же результат.

item_template.rb определил следующий класс:

  class NullObject
    def title
      ""
    end
  end

Есть идеи?

1 Ответ

0 голосов
/ 05 октября 2018

destroy для активного объекта записи удалит его из базы данных, но объект останется в памяти.

лучше было бы сделать

item_run.reload

до ожидаемого, нов зависимости от того, как вы определили отношение, вы можете получить ошибку, что item_template не найден.

Если ваш 'item_template' имеет

has_many :item_runs, dependent: :nullify

Тогда не будет ошибки(при условии, что item_run имеет belongs_to :item_template, optional: true)

Но так как item_run не будет иметь item_template, то выполнение item_run.item_template.title даст вам ошибку отсутствия метода для Nil: NilClass.

Основная очередь ... если item_run существует без item_template?

Если нет, то выполните

has_many :item_runs, dependent: :destroy

И это автоматически уничтожит item_run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...