Учитывая, что это пример совместного использования контроллера, вы можете использовать следующее:
shared_examples 'my spec' do
it 'will not redirect' do
get path
expect(response).to render_template(request.params['action'])
end
end
Rspec.describe 'MySpec' do
it_behaves_like 'my spec' do
let(:path) { new_user_path }
end
end
В контексте вашего пользовательского контроллера тест будет:
it 'will not redirect' do
get new_user_path # => get '/users/new'
expect(response).to render_template('new')
end
RSpec's render_template
matcher нужно только действие.
Я не думаю, что существует простой способ перенести изменяемую структуру данных как неизменную. Неизменные структуры данных становятся эффективными, когда новая версия может обменяться данными со старой версией умными способами, и я не могу действительно видеть, как это может быть сделано без доступа к внутренностям PriorityQueue
.
Если Вы действительно хотите персистентную приоритетную очередь, этот поток мог бы быть интересным. У них, кажется, есть линейно-разовые вставки, хотя, поэтому если это - проблема, возможно, необходимо искать другую реализацию.
Править: Вообще-то, если задуматься простая реализация персистентной приоритетной очереди должна только сохранить (prio, значение) - пары в отсортированном наборе. Что-то вроде этого:
(defn make-pqueue []
(sorted-set))
(defn pqueue-add [pq x prio]
(conj pq [prio x]))
(defn pqueue-peek [pq]
(first pq))
(defn pqueue-pop [pq]
(let [top (first pq)]
(disj pq top)))
Конечно, код выше довольно ограничен (никакие многократные въезды, например), но он иллюстрирует идею.
Вы не можете автоволшебно сделать изменяемый класс неизменным. Можно всегда называть класс Java непосредственно и видоизменять его.
Для принуждения неизменности, можно или реализовать его в clojure, или расширить класс Java и выдать исключения во всех изменяемых реализациях метода.