Ruby测试期望运行一个命令

Ruby测试期望运行一个命令,ruby,command,minitest,stubbing,Ruby,Command,Minitest,Stubbing,我使用Minitest测试Rails应用程序,并进行单元测试和集成测试,希望测试是否使用某些参数调用命令行命令 比如说,我有一门课: class Provisioning::Backup def create(path) system("tar -czf #{path} bar.tar.gz") end end 我的测试只想知道带有这些参数的命令是否运行。而不是它是使用system()还是它的替代品`。或者甚至通过重新调整等等。我想测试外部,而不是内部实现 因此,我对*test

我使用Minitest测试Rails应用程序,并进行单元测试和集成测试,希望测试是否使用某些参数调用命令行命令

比如说,我有一门课:

class Provisioning::Backup
  def create(path)
    system("tar -czf #{path} bar.tar.gz")
  end
end
我的测试只想知道带有这些参数的命令是否运行。而不是它是使用
system()
还是它的替代品
`
。或者甚至通过重新调整等等。我想测试外部,而不是内部实现

因此,我对*test/integration/user\u requests\u backup\u 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
class UserRequestsBackupTest
这是可行的,但会断言实现而不是行为,因为
Provisioning::Backup.expected(:system).with(“tar-xzf foo bar”)
对内部工作做了太多的假设,一旦我将其移动到例如resque,就会失败


我的其他选择是什么?是否有一种方法可以模拟或存根,并在较低级别上期望
系统
?是否有一种模式或gem允许以更通用的方式模拟和期望命令?

您所做的是集成测试。您还需要一个低级别的单元测试,它不关心
system
方法的结果,但要确保正确调用它

我只知道Rspec实现这一点的方法,但不知道minitest,它使用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

您所做的是集成测试。您还需要一个低级别的单元测试,它不关心
system
方法的结果,但要确保正确调用它

我只知道Rspec实现这一点的方法,但不知道minitest,它使用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

有一条经验法则,你应该“只模仿你拥有的对象”。在本例中,您似乎希望确保创建了压缩存档。您的应用程序中可能有一个对象或方法,该对象或方法的唯一责任是执行此操作

让我们假设您有一个名为
create\u archive
的方法来执行此操作。通过
create_archive
上的适当单元测试覆盖率,您可以简单地验证它是从集成测试中调用的。 您应该期望并验证调用的是此方法,而不是对或的调用。这些调用是实现细节,您需要验证逻辑(
create\u archive

class UserRequestsBackupTest
有一条经验法则,你应该“只模仿你拥有的对象”。在本例中,您似乎希望确保创建了压缩存档。您的应用程序中可能有一个对象或方法,该对象或方法的唯一责任是执行此操作

让我们假设您有一个名为
create\u archive
的方法来执行此操作。通过
create_archive
上的适当单元测试覆盖率,您可以简单地验证它是从集成测试中调用的。 您应该期望并验证调用的是此方法,而不是对或的调用。这些调用是实现细节,您需要验证逻辑(
create\u archive

class UserRequestsBackupTest
是的,我还有测试方法的单元测试等等。我的问题是,我希望我的集成测试能够测试更少的实现,因为我正在单元测试中测试该实现。我的问题是关于如何在我的集成测试中测试/不测试/实现。是的,我还有测试方法的单元测试等等。我的问题是,我希望我的集成测试能够测试更少的实现,因为我正在单元测试中测试该实现。我的问题是关于如何在集成测试中测试实现。