2009-11-10 20 views
5

Çıkışı bir komut satırı aracından test etmeye çalışıyorum. Rspec ile bir komut satırı çağrısını nasıl 'uyandırırım? Aşağıdakileri yapmazsınız:Bir çağrıyı rspec ile komut satırına nasıl taklit edebilirim?

it "should call the command line and return 'text'" do 
    @p = Pig.new 
    @p.should_receive(:run).with('my_command_line_tool_call').and_return('result text') 
end 

Bu saplamayı nasıl oluştururum?

+0

biz 'Pig' sınıfının ilgili parçalarını görebilir mi? – hgmnz

cevap

6

Yaptığım hızlı bir örnek. Ben kukla sınıfımdan ls'u arıyorum. RSpec

require "rubygems" 
require "spec" 

class Dummy 
    def command_line 
    system("ls") 
    end 
end 

describe Dummy do 
    it "command_line should call ls" do 
    d = Dummy.new 
    d.should_receive("system").with("ls") 
    d.command_line 
    end 
end 
+0

Poifect: -) ... Teşekkürler! – btelles

+0

Sanırım koşuya/sistem çağrısına bile ulaşamayan diğer engelleyici hatalar vardı. – btelles

+8

Bu, sisteme nasıl uyuyor veya alay ediyor? – Automatico

-5

Alternatif ile test edilmiştir, sadece Çekirdek sistem yöntemini yeniden tanımlamak olabilir:

module Kernel 
    def system(cmd) 
    "call #{cmd}" 
    end 
end 

> system("test") 
=> "call test" 

Ve kredi bu soruya şöyle: Mock system call in ruby

+1

Bu cevap neden bu kadar çok not düşüyor? @jpatokal'in atıf yaptığı cevap 17 puana sahip! – hagello

+0

Muhtemelen taklidi/alay konusu olmadığından, aslında * yöntemi * değiştirdiğinden. Sonra tekrar, testlerde gerçek sistem çağrıları yapmak ister misiniz? – jpatokal

11

new message expectation syntax kullanma:

spec /dummy_spec.rb

require "dummy" 

describe Dummy do 
    it "command_line should call ls" do 
    d = Dummy.new 
    expect(d).to receive(:system).with("ls") 
    d.command_line 
    end 
end 

lib/dummy.rb

class Dummy 
    def command_line 
    system("ls") 
    end 
end 
İlgili konular