나는 조롱하는 데 문제가 있습니다. 나는 DistanceMatrix 클래스를 가지고 있으며 은/else 문에서 form_matrix가 호출 된 메서드를 나타내기를 원합니다. 모카와 RSpec을 사용해야합니다. 어떤 아이디어?루비. 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
하지만 오류가있어 : 나는 RSpec에 우리가하지 .expects를 사용하는 것을 발견
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
()하지만 .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
#should_receive이 RSpec에의 조롱을 사용 - 원래는 모카를 사용하고있다. 모카를 사용하려면 프로젝트의 spec_helper.rb에서 구성해야합니다. – karmajunkie
그 두 가지 오류는 form_matrix가 예상대로 호출되지 않았다는 것을 알려줍니다. 나는 그 문제가 당신의 시험에 있다고 생각하지 않습니다.내 생각 엔 당신이 이니셜 라이저에 전달하는 것은 줄 바꿈 된 문자열 또는 다른 것이므로 args [0] .class! = String입니다. 무슨 일이 일어나고 있는지 디버거에서 확인해 봤어? – karmajunkie
아니요, 어떻게 리눅스 터미널에서 디버깅 할 수 있습니까? – Martynas