У меня есть около ста файлов спецификаций, которые работают параллельно, используя parallel_rspec
.Каждая спецификация зависит от идентификатора продукта, который необходим для запуска спецификации.Я хочу иметь возможность запускать спецификации для разных продуктов каждый раз.Как получить спецификацию, чтобы выбрать product_id из очереди, использовать его в спецификации и вернуть обратно в очередь, как только это будет сделано для использования в другом тесте?Пример спецификации:
describe 'Test 1' do
let(:product) {Product.new(12345)}
it 'checks something on the product page' do
visit("/product/#{product.id}")
# assert some data on the page
end
end
Я хочу построить очередь, в которой я могу хранить несколько сотен идентификаторов продуктов, из которых каждый пример может выбрать один при запуске и поместить его обратно в очередь, чтобы другие примеры могли его использовать.
Я пробовал что-то вроде
class ProductPicker
$product_ids = [1,2,3,4.....100]
def self.pick
product_id = $product_ids.sample
$product_ids.delete(product_id)
end
end
, а затем в спецификации
let(:product) {ProductPicker.pick)}
Это работает, но как я могу вернуть продукт в очередь?Мне нужно поставить его обратно в очередь, потому что в 100 файлах спецификаций у меня более 1000 спецификаций и доступно ограниченное количество продуктов.Другая проблема заключается в том, что всегда есть вероятность, что 2 спецификации будут работать параллельно, пытаясь получить доступ к одному и тому же продукту из очереди.Как я могу сделать это безопасным для этого?Также открыт для альтернативной реализации