Rspec удалить столбец activerecord с именем метода для тестирования поведения - PullRequest
0 голосов
/ 20 июня 2019

В моем приложении.Если в таблице users есть столбец foo, в результате чего activerecord добавляет foo метод именованного экземпляра в класс User, вызов MyEngine.bar вернет 'xyz'.
И если этот столбец неопределено, MyEngine.bar вызов вернет 'abc'.Это изменение поведения вызвано этим кодом в bar вызове метода: current_user.respond_to?(:foo)

Как мне проверить это поведение?

Поток тестирования, который я имею в виду, выглядит следующим образом:

it "does something" do
  user = FactoryBot.create(:user, foo: "something")
  sign_in(user)
  expect(MyEngine.bar).to eq "xyz"
  # remove foo here to test how user responds when it's missing
  expect(MyEngine.bar).to eq "abc"
end

Я хочу иметь возможность временно удалить столбец foo для целей тестирования.

1 Ответ

0 голосов
/ 23 июня 2019

В соответствии с нашим обсуждением в разделе комментариев, при условии, что вы можете заглушить / контролировать current_user, что я сделаю:

it "does something" do
  user = FactoryBot.create(:user, foo: "something")
  sign_in(user)
  expect(MyEngine.bar).to eq "xyz"

  # here we remove foo method for only this instance of user
  user.singleton_class.class_eval {undef :foo}
  # Now stub call to current_user, of-course this line 
  # will adapt your code in MyEngine and how it calls current_user
  # also note expect, you may use allow here instead, but i would prefer expect
  expect(MyEngine).to receive(:current_user).and_return(user)
  expect(MyEngine.bar).to eq "abc"
  # You will get back foo method on any new user instances:
  # user = User.find(user.id)
end

Этот подход очень сильно ограничивает последствия.Должен решить вашу проблему согласно моему пониманию.

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