我使用 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
在较低级别?是否存在允许以更通用的方式模拟和期望命令的模式或 gem?