On Jul 7, 2010, at 7:39 AM, Wincent Colaiuta wrote:

> El 07/07/2010, a las 13:29, David Chelimsky escribió:
> 
>> Seems as though this format has been abandoned in this conversation:
>> 
>> it { should route(get "/issues/new").to("issues#new") }
>> it { should generate("/issues/new").from("issues#new") }
>> 
>> I think that verbiage is concise and intention revealing, and keeps the path 
>> on the left and the details on the right.
> 
> True, but it also looks like it might be a little painful to implement. 
> Seeing as you propose a little further down that we should also be able to do 
> stuff like:
> 
>  it { should_not route(get "/issues/new") }
> 
> That means that "route" needs to be (or return) a matcher that also, 
> optionally, responds to the "to" message and returns another matcher.
> 
> And "generate" needs to return a proxy that responds to "from" and returns 
> the real matcher, but itself raises an exception if the user mistakenly uses 
> it without chaining the "from" onto it.
> 
> Seems fairly magical compared to what we have right now, or what I proposed 
> earlier on.

The chain method in matchers is intended just for this purpose:

matcher :foo do |expected_foo|
  match do |actual|
    if @expected_bar
      # do one thing
    else
      # do another
    end
  end

  chain :bar do |expected_bar|
    @expected_bar = expected_bar
  end
end

thing.should foo('blah').bar('blah again')
    

>> Supported variants would be:
>> 
>> it { should route(:get => "/issues/new") ... # explicit hash for method/path
>> it { should route("/issues/new")...  # defaults to get
>> it { should ...to(:controller => "issues", :action => "new") } # explicit 
>> hash for params
>> 
>> The negative version would be:
>> 
>> it { should_not route(get "/issues/new") }
>> 
>> We could alias route() with recognize() to get:
>> 
>> it { should_not recognize(get "/issues/new") }
> 
> Sounds sensible.
> 
>> We still need to consider output. For example:
>> 
>> it { should route("/issues/37").to("issues#show", :id => 37) }
>> 
>> I think in this case we _might_ be able to figure out that 37 is the value 
>> of :id and output
>> 
>> should route "/issues/:id" to "issues#show"
>> 
>> Not sure if that'd be asking for trouble, but it seems feasible/reasonable.
> 
> I don't think it's worth it, to be honest. It would add a lot of complexity 
> just to save some characters in the spec output. (Saving characters when 
> _writing_ the specs seems more important.) And I think it's throwing away 
> information, because the user reading the spec now has to mentally unpack the 
> ":id" parameter, but doesn't actually see it. Multiple examples with 
> different :ids in them are now all going to look the same. And what if the 
> user has complex routes with requirements and regexp formats and stuff on 
> them? Won't that be a little hard to handle?

Agreed. I was thinking of an earlier suggestion that the output should read in 
a more generic way, but that can be managed explicitly by the spec-author.

>> In terms of the more verbose format for custom messages, we could add a 
>> router() method for sugar:
>> 
>> it "routes /issues/new to issues#new" do
>>   router.should route("/issues/new").to("issues#new") }
>> end
> 
> Yeah, adding router() is a good idea.
> 
>> And we still need the bi-directional version. I'm really at a loss on this 
>> one.
> 
> Perhaps something with/like the "have_routing" that Trevor suggested earlier? 
> Possibly:
> 
>  it { should have_routing('/issues/new').for('issues#new') }
> 
> I've pasted a comparison of the two proposals in their current forms here so 
> we can get a side-by-side (well, above/below) look at them:
> 
>  http://gist.github.com/466624
> 
> Still not convinced about the bi-directional language, though (used 
> "have_routing" in both flavors). If anyone can come up with better language 
> I'll update the comparison.

How about going back to map, with to_and_from:

  it { should map(get "/issues/new").to_and_from("issues#new") }

?????

> 
> For my taste, the first one reads nicer for most of the specs, but I like the 
> "router.should_not recognize('foo')" syntax, at least for the GET case. I 
> like it less for the non-GET case, though, where we have to nest another 
> method call (ie. "router.should_not recognize(put '/issues/123')".

What don't you like about the nesting?

> 
> Cheers,
> Wincent

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to