gpt4 book ai didi

ruby 。在 RSpec 中模拟

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

我对模拟有疑问。我有 DistanceMatrix 类(class),我会喜欢指出在 if/else 中调用了哪个方法 form_matrix陈述。我需要使用 mocha 和 RSpec。有什么想法吗?

class DistanceMatrix

def initialize(*args)
if args[0].class == String
form_matrix(get_data_from_yaml(args[0], args[1]))
elsif args[0].class == Array || args[0] == nil
form_matrix(get_data_from_db(args[0]))
end
end

def form_matrix(...)
...
end

end

它尝试过:

describe DistanceMatrix, "when mocking ..." do
it "should do call form_matrix" do
DistanceMatrix.any_instance.expects(:form_matrix).with([1]).once
DistanceMatrix.any_instance.expects(:get_data_from_yaml).with("file_name.yml").once.returns([1])
DistanceMatrix.new("file_name.yml")
end
end

但出现错误:

Failures:
1) DistanceMatrix when mocking ... should do call form_matrix
Failure/Error: DistanceMatrix.new("file_name.yml")
unexpected invocation: #<AnyInstance:DistanceMatrix>.get_data_from_yaml('file_name.yml', nil)
unsatisfied expectations:
- expected exactly once, not yet invoked: #<AnyInstance:DistanceMatrix>.get_data_from_yaml('file_name.yml')
- expected exactly once, not yet invoked: #<AnyInstance:DistanceMatrix>.form_matrix([1])
satisfied expectations:
- allowed any number of times, already invoked once: #<DistanceMatrix:0x9e48b40>.get_optimal_route(any_parameters)
- allowed any number of times, already invoked once: #<Database::Distances:0x9d59798>.load_distances(any_parameters)
# ./distance_matrix.rb:18:in `initialize'
# ./tsp_algorithm_spec.rb:253:in `new'
# ./tsp_algorithm_spec.rb:253:in `block (2 levels) in <top (required)>'
Finished in 0.25979 seconds

我发现在 RSpec 中我们不应该使用 .expects() 而应该使用 .should_receive(),所以我尝试了:

describe DistanceMatrix, "when mocking ..." do
it "should do call form_matrix" do
DistanceMatrix.any_instance.should_receive(:form_matrix).with([1])
DistanceMatrix.any_instance.should_receive(:get_data_from_yaml).with("file_name.yml").and_return([1])
DistanceMatrix.new("file_name.yml")
end
end

但是又遇到了新的失败:

Failures:
1) DistanceMatrix when mocking ... should do call form_matrix
Failure/Error: DistanceMatrix.any_instance.should_receive(:form_matrix).with([1])
(#<Mocha::ClassMethods::AnyInstance:0x96356b0>).form_matrix([1])
expected: 1 time
received: 0 times
# ./tsp_algorithm_spec.rb:251:in `block (2 levels) in <top (required)>'

Finished in 0.26741 seconds

最佳答案

我只有使用 Mocha 而不是 RSpec 的经验,但是查看 Mocha 失败消息,关键部分是这些:-

unexpected invocation: #<AnyInstance:DistanceMatrix>.get_data_from_yaml('file_name.yml', nil)
unsatisfied expectations:
- expected exactly once, not yet invoked: #<AnyInstance:DistanceMatrix>.get_data_from_yaml('file_name.yml')

如果您查看这些行的末尾,您会注意到未使用预期参数调用 get_data_from_yaml。它是用 ('filename.yml', nil) 而不是预期的 ('filename.yml') 调用的。

发生这种情况是因为当您在测试中仅使用 一个 参数调用 DistanceMatrix.new("file_name.yml") 然后在 DistanceMatrix#initialize 中调用时 DistanceMatrix#get_data_from_yaml 使用 (args[0], args[1]) 调用,因为 args 是单个元素数组,args[1] 将为 nil

也许这不是您期望的 Ruby 工作方式,但以下演示了这种行为:-

def foo(*args)
puts "args[0]=#{args[0].inspect}; args[1]=#{args[1].inspect}"
end

foo("string") # => args[0]="string"; args[1]=nil

关于 ruby 。在 RSpec 中模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4327716/

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