gpt4 book ai didi

ruby-on-rails - MiniTest 中的方法期望

转载 作者:数据小太阳 更新时间:2023-10-29 08:13:15 25 4
gpt4 key购买 nike

我正在尝试为 ActiveRecord 编写测试 - 而 Rails 使用 MiniTest 进行测试,所以我无法选择测试框架。我要测试的条件是这样的(来自 db:create rake 任务,为了这个例子的目的被拉入一个方法):

def create_db
if File.exist?(config['database'])
$stderr.puts "#{config['database']} already exists"
end
end

因此,我想测试 $stderr 在文件存在的情况下接收 put,否则不接收。在 RSpec 中,我会这样做:

File.stub :exist? => true

$stderr.should_receive(:puts).with("my-db already exists")

create_db

MiniTest 中的等价物是什么? assert_send 的行为似乎不像我预期的那样(并且实际上没有任何文档 - 它应该在执行之前进行,如 should_receive,还是之后?)。我在想我可以在测试期间用一个 mock 临时设置 $stderr,但是 $stderr 只接受响应写入的对象。您不能在 mock 上 stub 方法,而且我不想在我的 stderr mock 上设置对 write 方法的期望 - 这意味着我正在测试我正在模拟的对象。

我觉得我在这里使用 MiniTest 的方式不正确,因此不胜感激。

更新:这是一个有效的解决方案,但它设置了对 :write 的期望,这是不正确的。

def test_db_create_when_file_exists
error_io = MiniTest::Mock.new
error_io.expect(:write, true)
error_io.expect(:puts, nil, ["#{@database} already exists"])
File.stubs(:exist?).returns(true)

original_error_io, $stderr = $stderr, error_io

ActiveRecord::Tasks::DatabaseTasks.create @configuration

ensure
$stderr = original_error_io unless original_error_io.nil?
end

最佳答案

因此,事实证明 Rails 将 Mocha 与 Minitest 结合使用,这意味着我们可以利用 Mocha 更好的消息预期。工作测试如下所示:

def test_db_create_when_file_exists
File.stubs(:exist?).returns(true)

$stderr.expects(:puts).with("#{@database} already exists")

ActiveRecord::Tasks::DatabaseTasks.create @configuration
end

关于ruby-on-rails - MiniTest 中的方法期望,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067573/

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