1

単体テストと統合テストのために、Minitest とMochaを使用して Rails アプリケーションをテストしており、コマンドライン コマンドが特定のパラメーターで呼び出されるかどうかをテストしたいと考えています。

たとえば、クラスがあります:

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

私のテストは、これらのパラメーターを持つコマンドが実行されるかどうかだけを知りたいのです。system()そして、それが使用するか、またはその代替を使用するかどうかではありません``。または resque などを介しても。内部実装ではなく、外部をテストしたい。

したがって、*test/integration/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より低いレベルでモックまたはスタブして期待する方法はありますか? より一般的な方法でコマンドをモックアウトして期待できるパターンまたは宝石はありますか?

4

2 に答える 2