Есть ли способ автоматического обновления ожидания RSpec? - PullRequest
0 голосов
/ 07 февраля 2019

Мне интересно, существует ли эта функция в RSpec.Кажется, я не могу найти никаких результатов, глядя на это.

Что я хотел бы сделать, это то, что можно сделать в тестах Jest, например:

// This is a Jest expectation

expect(foo).toMatchInlineSnapshot()

// On the first execution of this code, the value of foo will fill in the expectation and result in something like this

expect(foo).toMatchInlineSnapshot('bar')

I 'я бы хотел сделать это с помощью тестов RSpec.

# Here's an RSpec expectation

expect(foo).to eq({ bar: 25 })

Скажите, что я внесу изменение в свой код, в результате чего foo [: bar] будет иметь другое значение, но я не знаюкаким будет это значение.

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

 Failure/Error: expect(foo).to eq({ bar: 25 })

       expected: { bar: 25 }
            got: { bar: 100 }

После этого мне нужно вручную обновить мойожидание для того, чтобы оно прошло.

В любом случае, нужно ли RSpec автоматически обновлять ожидаемое значение?

Например:

expect(foo).to eq({ bar: 25 }, {update: true})

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

expect(foo).to eq({ bar: 100 })

Существует ли какой-либо способ сделать это?Может быть, есть какая-нибудь команда, которую я могу запустить с RSpec?

spec UPDATE_EXPECTS=1

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

Спасибо за помощь

1 Ответ

0 голосов
/ 08 февраля 2019

Я не верю, что этот тип инструмента существует для RSpec.Самое близкое, к чему вы могли бы прийти - это использование let или переменной экземпляра в верхней части вашего скрипта.

let(:subtotal) { 25.0 } # can _maybe_ only update this if logic changed
let(:cart) { Cart.new }

before do
  cart.add_item(10.0)
  cart.add_item(15.0)
end

it do
  expect(cart.subtotal).to eq(subtotal)
end

Вам все равно придется вручную курировать значения, когда логические изменения нарушают тест.утверждение.В RSpec уже есть ряд сопоставлений, которые позволят вам сделать более слабое утверждение, например be_within , но ничего для автоматического заполнения значений для вас. include matcher является еще одним мощным средством сопоставления, которое позволяет делать более слабые утверждения.

Мне кажется, что автоматическое обновление значений будет эквивалентно тестированию expect(x).to eq(x).Я не уверен, что в такого рода тестах есть много смысла для того, для чего я обычно видел RSpec.

Реальность такова, что ваш тест должен / часто будет проваливаться, когда вы вносите изменения в свой код.Досадно, что вам приходится возвращаться и исправлять тест, но также следует убедиться, что тест предоставил определенную ценность.Я был бы более встревожен, если бы я изменил код и не провалил тест ...

...