2010-04-06 3 views
1

Как я могу издеваться над сортировкой массива, ожидая выражения лямбда?Mocking Sort With Mocha

Это тривиальный пример моей проблемы:

# initializing the data 
l = lambda { |a,b| a <=> b } 
array = [ 1, 2, 3, 4, 5 ] 
sorted_array = [ 2, 3, 8, 9, 1] 

# I expect that sort will be called using the lambda as a parameter 
array.expects(:sort).with(l).returns(sorted_array) 

# perform the sort using the lambda expression 
temp = array.sort{|a,b| l.call(a,b) } 

Теперь, сначала я ожидал, что это будет работать; однако я получил следующую ошибку:

- expected exactly once, not yet invoked: [ 1, 2, 3, 4, 5 ].sort(#<Proc:0xb665eb48>) 

Я понимаю, что это не сработает, потому что l не передается как параметр в l. Однако есть ли другой способ сделать то, что этот код пытается выполнить?

ПРИМЕЧАНИЕ. Я выяснил, как решить мою проблему, не выясняя, как это сделать. Я оставлю это открытым на случай, если у кого-то есть аналогичная проблема.

Приветствия, Джозеф

+0

Привет, Джозеф, я Брайан. Я подозреваю, может ли проблема быть вызвана «с (l)». С помощью того, как вы его используете, не следует сортировать вызов с параметром «l»? – Shuo

+0

Hey Bryan, Это имеет смысл. Сначала я предположил, что если вы предоставили блок кода для .sort, он передал бы l для сортировки. Итак, теперь я ищу другой способ сделать то, что пытается сделать этот код. Я отредактировал сообщение, чтобы конкретно включить этот запрос. – user175750

+0

Вижу, вы уже указали это в своем первоначальном вопросе. :) Я использую машину, на которой рубин не установлен. Посмотрите на эту проблему позже. Удачи. – Shuo

ответ

1

Mocking методы с блоками может быть довольно запутанным. Один из ключей - это понять, какое поведение вы хотите протестировать. Я не могу сказать из вашего примера кода, что именно вы хотите протестировать. Однако вы можете найти документацию для Mocha::Expectation#yields (или даже Mocha::Expectation#multiple_yields).