Интерфейс на командния ред за модулно тестване

Използвам clamp - рамката на командния ред за моето ruby ​​приложение и не съм сигурен как да стартирам своя clamp обекти за модулно тестване. Моят обект на скоба изглежда така

class myCommand < Clamp::Command
  parameter "first", "first param"
  parameter "second", "second param"

  def execute
    #Data
  end
end

И се изпълнява от командния ред по този начин

$~> myCommand first second

В момента в моите rspec тестове трябва да задам свойствата на обектите директно по този начин.

  before(:each) do
   $stdout = StringIO.new
   @my_command = myCommand.new("")
   @my_command.first= "first"
   @my_command.second= "second"
 end

Изглежда, че това не е правилният начин за иницииране на обектите на скоби за тестване, но не съм сигурен кой е правилният начин да направя това. Чудех се дали някой има някакви идеи. Благодаря


person namtax    schedule 14.11.2011    source източник


Отговори (1)


И така, това, което правите е:

  • създаване на екземпляр на Command
  • задаване на атрибути върху него
  • обаждам се на #execute

Това е чудесен начин да тествате команда Clamp и вероятно е най-добрият начин за модулно тестване на логиката на вашия #execute метод.

Ако желаете да тествате анализиране на аргументи от командния ред, можете да упражните метода #parse и да проверите стойностите на атрибути, напр.

before do
  @command = MyCommand.new("my")
end

describe "#parse" do

  before do
    @command.parse(["FOO", "BAR"])
  end

  it "sets attribute values" do
    @command.first.should == "FOO"
    @command.second.should == "BAR"
  end

end

Но това започва да тества самия Clamp, а не вашия собствен код ... така че вероятно няма да се занимавам.

Ако искате да тествате както анализирането, така и изпълнението заедно, опитайте нещо като:

describe ".run" do
  context "with two arguments" do
    it "does something useful" do
      MyCommand.run("cmd", ["ARG1", "ARG2"])
      # ... test for usefulness
    end
  end
end

Отново обаче начинът, по който тествате в момента, е напълно добър. Надявам се това да помогне.

person Mike Williams    schedule 14.11.2011
comment
Страхотен отговор, точно това, което търсех. Интересувам се само от тестване на кода в метода за изпълнение, така че търсех по-чист начин за инициализиране на моя команден обект в предишния метод. Ще използвам @command.parse, за да ми помогне да направя това. - person namtax; 14.11.2011