Sounds way overcomplicated for what you are trying to do.
I think you might have fallen into a classic trap of Rspec & TDD in general-- this is one of the reason why I do not support or use Rspec in a declarative style syntax as most of the docs suggest you do.
Think about this:
allow(subject).to receive(:process_urls).and_return(response)
Basic question: Are you testing the process_urls method itself? What you've done is stubbed it out, which is only appropriate when you're testing some other code and you don't want to test this code.
If you're testing the process_urls code, then don't stub it out.
I'm afraid the Rspec documentation has led you astray here and significantly confused you.
Wouldn't an approach like this be much simpler:
input = [...,...]
result = my_method(input)
expect(result).toBe (...)
The layers and layers of indirection in this testing style make it nearly impossible to read and I fear you may be stubbing out code that you actually want to be testing.
Don't get me wrong, stubbing is important to do-- but you should only stub out code when it is not in the class you're testing. (OK, very rarely you may be testing a method and want to stub out another method in the same class, but I even think that is an anti-pattern). Working with other objects that another library provides? Sure, stub it out. Working with an API that is bring written by another team? Absolutely, stub that out. Don't stub out the code that's the subject matter of the thing you are actually testing -- this is a snake eating its own tail and when you write tests like that you aren't really testing at all.
-Jason