2015-07-13 2 views
1

Я новичок в Ruby и RSpec, сделал небольшое исследование и увидел, что есть несколько способов сделать сортировку данных с помощью перечисления тестов из сообщений в Интернете, но они не попадают во многие детали, как полный учебник. Поэтому, прежде чем я снова просмотрю эти онлайн-статьи, подумал, что сначала попрошу здесь.Структурирование CSV-данных с помощью теста RSpec простым простым способом?

Вот как у меня есть настройка, основанная на стандартном простом способе использования RSpec (определенный описать & он блокирует, а не импортирует части RSpec, чтобы делать только ожидания). Тогда я пытаюсь добавить в данной ведомой способности к нему:

require 'rspec' 
require 'csv' 

describe "test suite name" do 
    before :all do 
    #this CSV mapping method found online... 
    @device_client = CSV.read path 
    @descriptor = @device_client.shift 
    @descriptor = @descriptor.map { |key| key.to_sym } 
    @device_client.map { |client| Hash[ @descriptor.zip(client) ] } 
    end 

    @device_client.each do |client| 
    describe "#{client[:test_scenario]}" do 
     if "match some CSV field value" 
     it "should run this kind of test" do 
      #additional code as needed 
      expect(some_actual).to eql(some_expected) 
     end 
     end 

     if "match some other CSV field value" 
     it "should run that kind of test" do 
      #additional code as needed 
      expect(some_actual).to eql(some_expected) 
     end 
     end 

     it "some other test common to all CSV rows" do 
     #stuff 
     end 
    end 
    end 

end 

Что я замечаю здесь в том, что @device_client равна нуль, как она структурирована прямо сейчас (отлажено с «р @device_client» заявление сбросить содержимое из) , Чтобы получить его значение, я должен заключить хэш внутри его блока, где он находится в области видимости (который, как правило, у меня внутри другого блока описания, хотя я предполагаю, что могу пропустить дополнительный описать).

Как я могу провести реструктуризацию теста, чтобы «прочитать» то же самое (читателю теста) и работать так, как я его намерен? Это нормально, если реструктуризация означает, что я не могу использовать стандартный формат RSpec и должен требовать компонентов RSpec по-разному (сообщения в Интернете, похоже, не соответствуют простому/базовому формату RSpec).

Я думаю, что мой код довольно грубо интерпретируется. В случае нет, целью является использование CSV-входа для динамического создания теста. Каждая строка CSV представляет собой сценарий, который имеет несколько тестов - 1 тест отличается на основе значения поля CSV, следовательно, ifs, остальные тесты являются общими для всех сценариев. И мы повторяем этот набор для столько строк сценария CSV, которые находятся в файле. И перед всем блоком находится глобальная настройка, прежде чем обрабатывать данные CSV.

В реструктуризации, в идеале, я хотел бы оставить описание текстовых блоков (или их эквивалентных им), чтобы в результатах теста отображались описания тестов, а не только куча ожиданий.

ответ

2

Что-то, как это должно работать:

require 'csv' 

describe "test suite name" do 
    device_client = CSV.read path 
    descriptor = device_client.shift 
    descriptor = descriptor.map { |key| key.to_sym } 
    clients = device_client.map { |client| Hash[ descriptor.zip(client) ] } 

    clients.each do |client| 
    describe "#{client[:test_scenario]}" do 
     if "match some CSV field value" 
     it "should run this kind of test" do 
      #additional code as needed 
      expect(some_actual).to eql(some_expected) 
     end 
     end 

     if "match some other CSV field value" 
     it "should run that kind of test" do 
      #additional code as needed 
      expect(some_actual).to eql(some_expected) 
     end 
     end 

     it "some other test common to all CSV rows" do 
     #stuff 
     end 
    end 
    end 
end 

Заметные изменения от версии:

  • Нет необходимости требовать rspec (RSpec будет загружаться автоматически при запуске команды rspec).
  • Я переместил логику CSV из before(:all) и в корпус describe. Проблема с тем, что у вас было до этого, заключается в том, что запущены before крючки после все примеры и группы определены непосредственно перед выполнением определенной группы. Вы должны использовать содержимое файла CSV во время определения спецификации (в течение которого выполняется блок describe).
  • Я переключился с переменных экземпляра на локальные переменные. То, что у вас было до этого, не работало, потому что крючок before(:all) выполняется в контексте экземпляра класса группы примеров, где, поскольку блок описания работает в контексте самого класса, - поэтому они работают в разных контекстах и ​​не работают имеют доступ к тем же переменным экземпляра. Как только мы переместим логику в блок describe, вы можете просто использовать простые локальные переменные.
  • Я добавил clients = в последнюю строку вашего before(:all) логики. То, что у вас было раньше, выбрало результат device_client.map { ... }, но я предполагаю, что это то, что вы хотите использовать.

Более подробную информацию о разнице в объеме между describe и before блока, см section in the rspec-core README that discusses scope.

+0

Спасибо, за решение и проницательную информацию. – David

Смежные вопросы