Как разделить данные между реализацией и описанием спецификации? - PullRequest
0 голосов
/ 03 декабря 2011

Интересно, есть ли хороший способ повторного использования данных между реализацией и описанием спецификации ... Более конкретно, я хотел бы иметь возможность сделать что-то вроде следующего:*

Конечно, этот код не будет работать - arg1 и arg2 недоступны вне спецификаций.Можно ли достичь аналогичного результата без использования глобальных переменных или внешних классов?

Обновление:

Меня интересует вывод спецификации.Примерно так:

#some_method
  with 'Sample String 1' its result
    should == 1
  with 'Sample String 2' its result
    should == 2

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

Ответ в том, что вы не используете динамические описания. RSpec способ сделать это будет

describe "#some_method" do
  it "extracts the number correctly" do
    some_method("Sample String 1").should == 1
    some_method("Sample String 2").should == 2
  end
end

Нет проблем с жестким кодом тестовых данных в ваших спецификациях. Если вы хотите более полный вывод, вы можете использовать custom matcher

require 'rspec'

class Test
  def some_method(str)
    str[/[0-9]+/].to_i
  end
end

RSpec::Matchers.define :return_value_for_argument do |result, arg|
  match do |actual|
    actual.call(arg) == result
  end

  description do
    "return #{result.inspect} for argument #{arg.inspect}"
  end
end

describe Test do
  let(:test) { Test.new }
  describe "#some_method" do
    subject { test.method(:some_method) }

    it { should return_value_for_argument 1, "str 1" }
  end
end
1 голос
/ 20 июля 2012

При тестировании API я нахожу невероятно полезным иметь возможность видеть путь, параметры и ответ каждого теста. Я использовал очень полезные советы, данные Джеффом Найманом , чтобы хранить вещи в example.metatadata [: thing_i_want_to_store_like_url] каждого теста и с помощью специального средства форматирования распечатать его.

Итак, результаты моих тестов выглядят примерно так:

 that jonathan does not know it exists
 :path  : /user/20
 :params: {}
  => response: {"error"=>{"message"=>"error", "code"=>404}}

    that jonathan cannot edit
    :path  : /user/20/update
    :params: {:name=>"evil_name"}
    => response: {"error"=>{"message"=>"error", "code"=>404}}
0 голосов
/ 05 декабря 2011

Неуместно приводить конкретные аргументы в ваших описаниях.Ваши описания должны содержать удобочитаемое описание желаемого поведения, в большинстве случаев без ссылки на конкретные аргументы.

...