gpt4 book ai didi

ruby - Ruby测试期望命令会被执行

转载 作者:行者123 更新时间:2023-12-03 10:07:07 24 4
gpt4 key购买 nike

我使用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。

我还有其他选择吗?有没有一种方法可以模拟或 stub 并期望在较低级别上使用 system?可能有某种模式或 gem 可以以更通用的方式模拟和期望命令吗?

最佳答案

有一个经验法则,您应该“仅模拟您拥有的对象”。在这种情况下,您似乎要确保已创建压缩存档。您可能应该在应用程序中某处有一个对象或方法,唯一负责执行此操作的对象或方法。

假设您有一个名为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

关于ruby - Ruby测试期望命令会被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18352900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com