Не самый чистый способ, но, по крайней мере, сработает ожидание нулевого значения до теста и повторное его отключение после этого.Таким образом, изменяя спецификацию на
RSpec.describe Foo do
subject { Foo.new.bar(obj) }
context 'when obj is nil' do
let(:obj) { nil }
before do
RSpec::Mocks.configuration.allow_message_expectations_on_nil = true
end
after do
RSpec::Mocks.configuration.allow_message_expectations_on_nil = false
end
it 'does not call :foo' do
expect(obj).to_not receive(:foo)
subject
end
end
end
Если это повторяющийся шаблон, можно также поместить его до и после блока внутри макроса rspec (context 'when obj is nil', nil_mock: true do
).
Однако я неконечно, если оно того стоит, так как при работе с этими глобальными настройками есть побочные эффекты, которые могут привести к ошибкам, зависящим от порядка, которые потом сложно отладить.Кроме того, я бы на самом деле только проверял, была ли вызвана foo
, когда она является командой, то есть она изменяет состояние системы и, как таковая, имеет побочные эффекты.Если он просто обращается к переменной или вычисляет значение и, как таковой, не имеет побочных эффектов, я бы вообще не стал тестировать вызов и вместо этого сосредоточился бы на тестировании ввода и вывода тестируемого метода.