receive_message_chain
считается запахом, поскольку позволяет легко нарушать Закон Деметры .
expect_any_instance_of
считается запахом в том смысле, что он не является специфическим длявызывается экземпляр Foo.
Как отметил @GavinMiller, эти практики обычно зарезервированы для устаревшего кода, который вы не контролируете.
Вот как можно протестировать Foo.new.bar(arg)
без:
class Baz
def do_something
Foo.new.bar('arg')
end
end
describe Baz do
subject(:baz) { described_class.new }
describe '#do_something' do
let(:foo) { instance_double(Foo, bar: true) }
before do
allow(Foo).to receive(:new).and_return(foo)
baz.do_something
end
it 'instantiates a Foo' do
expect(Foo).to have_received(:new).with(no_args)
end
it 'delegates to bar' do
expect(foo).to have_received(:bar).with('arg')
end
end
end
Примечание: я жестко кодирую аргумент здесь для простоты.Но вы могли бы так же легко и издеваться над этим.Показ того, что здесь будет зависеть от того, как создается аргумент arg.
EDIT
Важно отметить, что эти тесты хорошо знакомы с базовой реализацией.Поэтому, если вы измените реализацию, тесты не пройдут.Как решить эту проблему, зависит от того, что именно делает метод Baz#do_something
.
Допустим, Baz#do_something
на самом деле просто ищет значение из Foo#bar
на основе arg
и возвращает его без изменения состояния в любом месте.(Это называется методом Query.) В этом случае наши тесты вообще не должны заботиться о Foo, они должны заботиться только о том, чтобы правильное значение возвращалось Baz#do_something
.
С другой стороны, давайтескажем, что Baz#do_something
на самом деле где-то меняет состояние, но не возвращает тестируемое значение.(Это называется методом Command.) В этом случае мы должны утверждать, что правильные соавторы были вызваны с правильными параметрами.Но мы можем верить, что модульные тесты для этих других объектов будут фактически проверять их внутренние компоненты, поэтому мы можем использовать макеты в качестве заполнителей.(Тесты, которые я показал выше, относятся именно к этому разнообразию.)
Это фантастический разговор об этом, написанный Сэнди Метц в 2013 году. Специфика технологий, которые она упоминает, изменилась.Но основное содержание того, как проверить то, что на 100% актуально сегодня.