gpt4 book ai didi

ruby-on-rails - 如何使用 rspec mocks 3.3 测试方法的救援 block

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:09 25 4
gpt4 key购买 nike

帮我通过这个测试:

这里是一些 rspec 代码的例子,

class User
attr_accessor :count

def initialize
@count = 0
end

# sometimes raises
def danger
puts "IO can be dangerous..."
rescue IOError => e
@count += 1
end

#always raises
def danger!
raise IOError.new
rescue IOError => e
@count += 1
end
end

describe User do
describe "#danger!" do
it "its rescue block always increases the counter by one" do
allow(subject).to receive(:'danger!')

expect {
subject.danger!
}.to change(subject, :count).by(1)
end
end

describe "#danger" do
context "when it rescues an exception" do
it "should increase the counter" do
allow(subject).to receive(:danger).and_raise(IOError)

expect {
subject.danger
}.to change(subject, :count).by(1)
end
end
end
end

我还创建了一个 fiddle有了这些测试,你就可以让它们通过。请帮我测试一个方法的救援 block !


背景:

我最初的问题是这样的:

我有一个方法,如下所示:

def publish!(resource)
published_resource = resource.publish!(current_project)

resource.update(published: true)

if resource.has_comments?
content = render_to_string partial: "#{ resource.class.name.tableize }/comment", locals: { comment: resource.comment_content_attributes }

resource.publish_comments!(current_project, published_resource.id, content)
end

true

rescue Bcx::ResponseError => e
resource.errors.add(:base, e.errors)

raise e
end

我想测试 resource.errors.add(:base, e.errors) 实际上是在向资源添加错误。更一般地说,我想在一个方法中测试救援 block 。

所以我想写这样的代码,

it "collects errors" do 
expect{
subject.publish!(training_event.basecamp_calendar_event)
}.to change(training_event.errors.messages, :count).by(1)
end

当然,这会引发错误,因为我在救援区再次加注。

我见过一些使用旧的 something.stub(:method_name).and_raise(SomeException) 的答案,但 rspec 提示说这种语法已被弃用。我想使用 Rspec Mocks 3.3allow 语法,但我遇到了困难。

最佳答案

allow(something).to receive(:method_name).and_raise(SomeException)

将是新的 allow 语法。查看the docs供引用。

关于ruby-on-rails - 如何使用 rspec mocks 3.3 测试方法的救援 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32127789/

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