Лучший подход, я считаю, состоит в том, чтобы заглушить метод Thread.new
и убедиться, что любой «сложный» материал находится в своем собственном методе, который можно проверить индивидуально. Таким образом у вас будет что-то вроде этого:
class Foo
def start
Thread.new do
do_something
end
end
def do_something
loop do
foo.bar(bar.foo)
end
end
end
Тогда вы бы протестировали так:
describe Foo
it "starts thread running do_something" do
f = Foo.new
expect(Thread).to receive(:new).and_yield
expect(f).to receive(:do_something)
f.start
end
it "do_something loops with and calls foo.bar with bar.foo" do
f = Foo.new
expect(f).to receive(:loop).and_yield #for multiple yields: receive(:loop).and_yield.and_yield.and_yield...
expect(foo).to receive(:bar).with(bar.foo)
f.do_something
end
end
Таким образом, вам не нужно так много раздувать, чтобы получить желаемый результат.