В данном примере instance_variable_set используется для демонстрации, как можно напрямую устанавливать переменные экземпляра в тестах. В реальных сценариях это может быть полезно, если вы хотите протестировать метод, который зависит от переменной экземпляра, но не хотите или не можете вызвать метод, который её устанавливает. на примере нашего калькулятора:
class Calculator
def initialize(initial_value = 0)
@result = initial_value
end
def add(a, b)
@result += a + b
end
def multiply_result_by(factor)
@result *= factor
end
def result
@result
end
end
И тест для него:
RSpec.describe Calculator do
describe "#add" do
it "returns the sum of two numbers and multiplies the result by a factor" do
calculator = Calculator.new
# Устанавливаем начальное значение переменной экземпляра @result
calculator.instance_variable_set(:@result, 5)
# Вызываем метод add, который изменяет @result, добавляя к нему сумму 3 и 4
calculator.add(3, 4)
# Проверяем, что @result теперь равен 12 (5 + 3 + 4)
expect(calculator.result).to eq(12)
# Вызываем метод multiply_result_by, который умножает @result на заданный фактор
calculator.multiply_result_by(2)
# Проверяем, что @result теперь равен 24 (12 * 2)
expect(calculator.result).to eq(24)
end
end
end