2013-08-21 1 views
1

Minitest 및 Mocha에 대해 유닛 및 통합 테스트를 위해 레일즈 애플리케이션을 테스트하고 특정 매개 변수로 명령 행 명령이 호출되는지 테스트하려고하는지 테스트하려고합니다. 이러한 매개 변수와 그 명령이 실행됩니다 알고 싶어루비 테스트는 명령이 실행될 것으로 기대합니다

class Provisioning::Backup 
    def create(path) 
    system("tar -czf #{path} bar.tar.gz") 
    end 
end 

내 시험 :

말은, 내가 클래스가 있습니다. 그리고 system() 또는 그 대안 ``을 사용하는지 여부는 아닙니다. 또는 resque 등을 통해. 내부 구현이 아닌 외부를 테스트하고 싶습니다.

는 그러므로 나는 * 테스트/통합 내 현재 솔루션에 만족하지 않다/user_requests_backup_test.rb * :

class UserRequestsBackupTest < ActionDispatch::IntegrationTest 
    test "requests for a backup runs a backup-script" do 
    contact = contacts(:harry) 
    site = contact.sites.first 

    Provisioning::Backup.expects(:system).with("tar -xzf foo bar") 

    post "/v1/sites/#{site.id}/backups" 
    assert_response :success 
    end 

    # backup is already pending 
    # backup fails 
end 

이 작동하지만, Provisioning::Backup.expects(:system).with("tar -xzf foo bar")은 가정의 행동 때문에 오히려 그 이행을 주장 내부 작업에 대해 너무 많이와 이걸 예를 들어로 이동하자마자 실패 할 것입니다. resque.

다른 옵션에는 어떤 것이 있습니까? 모방하거나 스터브하고 낮은 레벨에서 system을 기대할 수있는 방법이 있습니까? 좀 더 일반적인 방식으로 명령을 조롱하고 기대할 수있는 패턴 또는 보석이 있습니까?

답변

0

당신이 한 것은 통합 테스트입니다. system 메서드의 결과에는 아무런 영향을 미치지 않지만 제대로 호출되는지 확인하는 낮은 수준의 단위 테스트가 필요합니다.

나는 rspec-mock 모듈을 사용하는 minestest가 아닌 Rspec 방법 만 알고 있습니다.

describe Provisioning::Backup do 
    subject { Provisioning::Backup.new } 

    it "calls system method correctly" do 
    subject.should_receive(:system).with('tar -czf #{path} bar.tar.gz') 
    subject.create 
    end 
end 
+0

예, 또한 방법을 테스트하는 단위 테스트 등이 있습니다. 내 질문은 구현 테스트가 적기 때문에 내 통합 테스트를 테스트하기 위해서이다. 왜냐하면 * 단위 테스트에서 그 구현을 테스트하기 때문이다. 내 질문은 내 통합 테스트에서 구현 방법/안/테스트 구현 방법에 관한 것입니다. – berkes

1

엄밀히 말하면 "소유 한 물건 만 조롱해야합니다. 이 경우 압축 된 아카이브가 만들어 졌는지 확인하려는 것 같습니다. 이 작업을 수행하는 것은 전적으로 귀하의 응용 프로그램에 어딘가에있는 객체 또는 메소드를 가져야합니다.

이 작업을 수행하는 create_archive이라는 메서드가 있다고 가정 해 보겠습니다. create_archive의 적절한 단위 테스트 커버리지를 사용하면 통합 테스트 내에서 호출되었는지 간단히 확인할 수 있습니다. Kernel#system 또는 Kernel#`을 호출하는 것이 아니라이 메서드가 호출되는지 예상하고 확인해야합니다. 이러한 호출은 구현 세부 사항이며 논리 (create_archive)를 대신 확인하려고합니다.

class UserRequestsBackupTest < ActionDispatch::IntegrationTest 
    test "requests for a backup runs a backup-script" do 
    contact = contacts(:harry) 
    site = contact.sites.first 

    Provisioning::Backup.expects(:create_archive) 

    post "/v1/sites/#{site.id}/backups" 
    assert_response :success 
    end 
end 
관련 문제