Пессимистическая блокировка не работает должным образом с перезагрузкой - PullRequest
0 голосов
/ 03 октября 2018

Пессимистическая блокировка не работает должным образом с перезагрузкой (используется в тестовых примерах).with_lock и reload не работают вместе, и тестовые случаи терпят неудачу.Если я удалил with_lock, тогда тестовые случаи работают нормально.

def method_name1
  self.with_lock do
    attributes["amount_used"] = get_total_amount_used
    attributes["updated_at"] = Time.now.utc
    Product.where(:id => self.id).update_all(attributes)
  end
end

Я написал тестовые примеры с использованием FactoryGirl.Он вызывает method_name1, который пересчитывает сумму после использованной суммы.Если вы проверите первый тестовый пример 1: total = 600 и amount_used = -200 (-ve означает уменьшение), теперь итоговое значение должно составлять 400,00.Аналогично для «Контрольного примера 2», после выполнения «Контрольного примера 1» общая сумма составляет 400,00.amount_used = 200 (+ ve означает добавление), итого должно быть 600,00.Но в тестовом примере 2 говорится 800.00.

context 'description' do
  before(:each) do
    @product.total = 600
    @product.method_name1
  end

  it 'is updated automatically if valid' do
    @product.amount_used = -200
    @product.save
    @product.reload
    should eq('400.0')       #Working
  end

  it 'is not changed if invalid' do
    @product.amount_used = 200
    @product.save
    @product.reload
    should eq('600.0')      #Not Working
  end
end

Ошибка для тестового примера 2: сбой / ошибка: must eq ('600.0')

   expected: "600.0"
        got: "800.0"

   (compared using ==)

1 Ответ

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

Результат теста 800 - правильный ответ.

before(:each) do
  @product.total = 600
  @product.method_name1
end

before(:each) означает, что этот фрагмент кода будет выполнен перед выполнением каждого примера, поэтому 600 + 200 равно 800. Если вы хотите, чтобы он выполнялся только один раззатем вы должны использовать before(:all), тогда этот фрагмент кода будет запущен только один раз перед запуском обоих примеров.

Подробнее об этом вы можете узнать из официальной документации .

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