Hello Aaron,

I  see something strange in my test. 

I have made this test-user. 

subject(:short_admin) do 
      Admin.new(name: "aaa")
end

which should fail because of this validation : 

 validates :name , presence:true,
                    inclusion: { in: 5..10 }

it fails but I was expected another error message.
 Now I see this one: "Name is not included in the list"
where I expected to see something like this : too short. Name must exist 
between 5 and 10 characters. 

Roelof


 




Op maandag 11 augustus 2014 08:45:30 UTC+2 schreef Roelof Wobben:

> Thanks, 
>
> I asked this because I did the Hartl tutorial and he uses this : 
>
> describe User do
>
>   before { @user = User.new(name: "Example User", email: "[email protected]") }
>
>
>
> and this : 
>
> before_save { self.email = email.downcase }
>
>
> And from  googling I get the impression that this is not the right way so 
> that is why I asked here. 
>
>
> Roelof
>
>
>
>
> Op zondag 10 augustus 2014 23:31:26 UTC+2 schreef Aaron Kromer:
>
>> That’s a few questions. Let me see if I can provide a little perspective 
>> on them. *Note these are just my opinions and do not reflect any RSpec 
>> standard / best practice / recommendation / etc.*
>>
>> …is not wise to use before
>>
>> This is largely a matter of opinion. Now, you may have come across 
>> something stating that before(:all) or it’s new more intent revealing 
>> alias before(:context) is not wise to use. In general, I agree with this 
>> view. This is only run once before the entire example group (context) it is 
>> defined in. There are rare cases where this is what you need, but 
>> generally, it’s not what you need. It usually leaks mutable state across 
>> specs, which can have very surprising and difficult to debug consequences. 
>> It also has many caveats regarding DB state, transactions, and other system 
>> level dependencies.
>>
>> On the other hand, before(:each) or the new before(:example), which is 
>> the default if you just write before, it more acceptable to use. It is 
>> also normally what you want. It keeps state clean across specs, it hooks 
>> into transactions, rspec-mocks, etc. Unless you have a provable, with valid 
>> data showing it, case where this is detrimental to performance, it’s the 
>> proper choice.
>>
>> Personally, I feel before and let should be used sparingly. They should 
>> be reserved for cases when you mean to state: *“All of the following 
>> specs in this group really must have this setup action done before each of 
>> them.”*
>>
>> Note I wrote “setup action”. This does not apply to any action regarding 
>> the object under test. I personally believe those should not be put in any 
>> before block, but explicitly listed in the spec so that it is clear what 
>> you are testing, versus what is setting up the testing environment. Let me 
>> share a code sample explaining this view:
>>
>> RSpec.describe Array, "list of elements" do
>>   describe "popping the array" do
>>     let(:element_list) do
>>       [:first, :second, :last]
>>     end
>>
>>     # This is the same as before(:each) or before(:example)
>>     before do
>>       element_list.pop
>>     end
>>
>>     # Note we are **cannot** use the same setup state since we need to 
>> capture
>>     # the value
>>     it "returns the last value of the array" do
>>       expect([:first, :second, :last].pop).to eq(:last)
>>     end
>>
>>     # Note it's very unclear what the test is doing just by looking at it.  
>> We
>>     # are describing an action on an Array instance. Yet, that isn't clear 
>> from
>>     # this spec at all, since all we see is that we check the array elements
>>     it "mutates the array removing the last element" do
>>       expect(element_list).to eq([:first, :second])
>>     end
>>   endend
>>
>> I’ve seen the above code “cleaned up” to be more expressive by converting 
>> it into something like:
>>
>> RSpec.describe Array, "list of elements" do
>>   describe "popping the array" do
>>     let(:array_with_elements) do
>>       [:first, :second, :last]
>>     end
>>
>>     # This is idiom is often viewed as an implicit `before`.
>>     #
>>     # Except, it's not. It's only run once you send the `element_list` 
>> message.
>>     # If you do this in the wrong spot then it may lead to surprising tests.
>>     #
>>     # This often leads people to use bang form `subject!`, which is
>>     # functionally the same as:
>>     #
>>     #   subject(:element_list) { ... }
>>     #   before { element_list }
>>     #
>>     # But this is often not the right tool and can have some surprising 
>> issues:
>>     # http://aaronkromer.com/blog/2013-05-19-the-bang-is-for-surprise.html
>>     #
>>     # Additionally, using `subject` here, IMO, is just wrong. The subject is
>>     # not the element returned from `#pop`. It's a specific instance of
>>     # `Array`. We are testing the behavior of `#pop`.
>>     subject(:popped_element) do
>>       array_with_elements.pop
>>     end
>>
>>     # Looks clean, but is misleading as to what is actually the subject of 
>> the
>>     # spec. Here it's the popped element, but in reality, it's the return 
>> value
>>     # of calling the action `pop`.
>>     it "returns the last value of the array" do
>>       expect(popped_element).to eq(:last)
>>     end
>>
>>     # This turns out to appear trickier to test. Often the initial pass looks
>>     # something like this:
>>     #
>>     #   expect(array_with_elements).to eq([:first, :second])
>>     #
>>     # That will fail though. Why? Because if we are not using the bang form 
>> of
>>     # `subject!`, a `before`, or something like `preload` (see blog link
>>     # above) then nothing is actually popped before this spec is run. Thus 
>> the
>>     # array is never mutated. Leaving `array_with_elements` unmodified.
>>     it "mutates the array removing the last element" do
>>       popped_element
>>       expect(array_with_elements).to eq([:first, :second])
>>     end
>>   endend
>>
>> I’ve also seen people go the following route, as well, it looks a bit 
>> cleaner:
>>
>> # Looks cleaner using ivars. In general, I am not a fan of ivars and 
>> instead# prefer to use local variables and message passing. This allows for 
>> clean# extractions of ideas / concepts without modifying lots of code.## For 
>> more details see this SO answer: 
>> http://stackoverflow.com/a/5359979/47438RSpec.describe Array, "list of 
>> elements" do
>>   describe "popping the array" do
>>     before do
>>       @element_list = [:first, :second, :last]
>>       @popped_element = @element_list.pop
>>     end
>>
>>     # Looks clean, but is misleading as to what is actually the subject of 
>> the
>>     # spec. Here it's the popped element, but in reality, it's the return 
>> value
>>     # of calling the action `pop`.
>>     it "returns the last value of the array" do
>>       expect(@popped_element).to eq(:last)
>>     end
>>
>>     # Again, looks clean, but is misleading. Here we are actually looking at
>>     # the real object under test (the proper subject). But, it's already
>>     # mutated. We still have to hunt down that mutation.
>>     it "mutates the array removing the last element" do
>>       expect(@element_list).to eq([:first, :second])
>>     end
>>   endend
>>
>> Another large issue I have with the last form above is it completely 
>> hides the mutation and behavior being tested in the before block. Just 
>> looking at the before block, it’s not obvious what is setup and what is 
>> being tested. It isn’t until I’ve read all of the specs, or a large number 
>> of them, that things become clear to me.
>>
>> This is why, I prefer a form more along the lines of:
>>
>> RSpec.describe Array, "list of elements" do
>>   describe "popping the array" do
>>     subject(:element_list) do
>>       [:first, :second, :last]
>>     end
>>
>>     it "returns the last value of the array" do
>>       expect(element_list.pop).to eq(:last)
>>     end
>>
>>     it "mutates the array removing the last element" do
>>       expect{ element_list.pop }.to change{ element_list }
>>         .from([:first, :second, :last])
>>         .to([:first, :second])
>>     end
>>   endend
>>
>> To me this is cleaner, more explicit, and more obvious what is happening. 
>> But I’m just one person.
>>
>> way to test validations
>>
>> I would test them just as I would any side-effect based protocol:
>>
>> RSpec.describe Admin, type: :model do
>>   describe "requires a name" do
>>     subject(:nameless_admin) do
>>       Admin.new(name: nil)
>>     end
>>
>>     it "is not valid" do
>>       expect(nameless_admin.valid?).to be false
>>     end
>>
>>     it "sets an error on the name attribute" do
>>       expect{ nameless_admin.valid? }
>>         .to change{ nameless_admin.errors[:name] }
>>         .from([])
>>         .to(include "can't be blank")
>>     end
>>   endend
>>
>>  inout of a form by using capybara
>>
>> This is a bit broader. In general, I simply go to the web page, fill in 
>> the form, then check the response. These are usually feature type 
>> acceptance specs. When I write these, I sometimes don’t adhere to the “one 
>> expectation per spec” guideline. This is because I am often testing a 
>> workflow, and I need to validate my expected assumptions along the path.
>>
>> RSpec.describe "Signing up for the site", type: :feature do
>>   it "requires a name to be specified" do
>>     visit sign_up_url
>>     click_button "Sign Up"
>>     expect(current_url).to eq sign_up_url
>>     expect(page).to have_contenxt "Name can't be blank"
>>   endend
>>
>> Checkout the capybara readme (https://github.com/jnicklas/capybara) for 
>> more examples.
>>
>>
>> Happy testing!
>>
>>
>> Aaron
>> <div 
>> title="MDH:VGhhdCdzIGEgZmV3IHF1ZXN0aW9ucy4gTGV0IG1lIHNlZSBpZiBJIGNhbiBwcm92aWRlIGEgbGl0
>>  
>> dGxlIHBlcnNwZWN0aXZlIG9uIHRoZW0uIF9Ob3RlIHRoZXNlIGFyZSBqdXN0IG15IG9waW5pb25z 
>> IGFuZCBkbyBub3QgcmVmbGVjdCBhbnkgUlNwZWMgc3RhbmRhcmQgLyBiZXN0IHByYWN0aWNlIC8g 
>> cmVjb21tZW5kYXRpb24gLyBldGMuXzxkaXY+PGJyPjwvZGl2PjxkaXY+Jmd0OyAuLi48c3BhbiBz 
>> dHlsZT0iZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzcHg7Ij5p 
>> cyBub3Qgd2lzZSB0byB1c2UgYGJlZm9yZWA8L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0i 
>> Zm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzcHg7Ij48YnI+PC9z 
>> cGFuPjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJp 
>> ZjsgZm9udC1zaXplOiAxM3B4OyI+VGhpcyBpcyBsYXJnZWx5IGEgbWF0dGVyIG9mIG9waW5pb24u 
>> Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7 
>> IGZvbnQtc2l6ZTogMTNweDsiPk5vdywgeW91IG1heSBoYXZlIGNvbWUgYWNyb3NzIHNvbWV0aGlu 
>> ZyBzdGF0aW5nIHRoYXQgYGJlZm9yZSg6YWxsKWAgb3IgaXQncyBuZXcgbW9yZSBpbnRlbnQgcmV2 
>> ZWFsaW5nIGFsaWFzIGBiZWZvcmUoOmNvbnRleHQpYCBpcyBub3Qgd2lzZSB0byB1c2UuIEluIGdl 
>> bmVyYWwsIEkgYWdyZWUgd2l0aCB0aGlzIHZpZXcuIFRoaXMgaXMgb25seSBydW4gb25jZSBiZWZv 
>> cmUgdGhlIGVudGlyZSBleGFtcGxlIGdyb3VwIChjb250ZXh0KSBpdCBpcyBkZWZpbmVkIGluLiBU 
>> aGVyZSBhcmUgcmFyZSBjYXNlcyB3aGVyZSB0aGlzIGlzIHdoYXQgeW91IG5lZWQsIGJ1dCBnZW5l 
>> cmFsbHksIGl0J3Mgbm90IHdoYXQgeW91IG5lZWQuIEl0IHVzdWFsbHkgbGVha3MgbXV0YWJsZSBz 
>> dGF0ZSBhY3Jvc3Mgc3BlY3MsIHdoaWNoIGNhbiBoYXZlIHZlcnkgc3VycHJpc2luZyBhbmQgZGlm 
>> ZmljdWx0IHRvIGRlYnVnIGNvbnNlcXVlbmNlcy4gSXQgYWxzbyBoYXMgbWFueSBjYXZlYXRzIHJl 
>> Z2FyZGluZyBEQiBzdGF0ZSwgdHJhbnNhY3Rpb25zLCBhbmQgb3RoZXIgc3lzdGVtIGxldmVsIGRl 
>> cGVuZGVuY2llcy48L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IGFy 
>> aWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzcHg7Ij48YnI+PC9zcGFuPjwvZGl2PjxkaXY+ 
>> PGZvbnQgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPk9uIHRoZSBvdGhlciBoYW5kLCBgYmVmb3Jl 
>> KDplYWNoKWAgb3IgdGhlIG5ldyBgYmVmb3JlKDpleGFtcGxlKWAsIHdoaWNoIGlzIHRoZSBkZWZh 
>> dWx0IGlmIHlvdSBqdXN0IHdyaXRlIGBiZWZvcmVgLCBpdCBtb3JlIGFjY2VwdGFibGUgdG8gdXNl 
>> LiBJdCBpcyBhbHNvIG5vcm1hbGx5IHdoYXQgeW91IHdhbnQuIEl0IGtlZXBzIHN0YXRlIGNsZWFu 
>> IGFjcm9zcyBzcGVjcywgaXQgaG9va3MgaW50byB0cmFuc2FjdGlvbnMsIHJzcGVjLW1vY2tzLCBl 
>> dGMuIFVubGVzcyB5b3UgaGF2ZSBhIHByb3ZhYmxlLCB3aXRoIHZhbGlkIGRhdGEgc2hvd2luZyBp 
>> dCwgY2FzZSB3aGVyZSB0aGlzIGlzJm5ic3A7ZGV0cmltZW50YWwmbmJzcDt0byBwZXJmb3JtYW5j 
>> ZSwgaXQncyB0aGUgcHJvcGVyIGNob2ljZS48L2ZvbnQ+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0i 
>> Zm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzcHg7Ij48YnI+PC9z 
>> cGFuPjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJp 
>> ZjsgZm9udC1zaXplOiAxM3B4OyI+UGVyc29uYWxseSwgSSBmZWVsIGBiZWZvcmVgIGFuZCBgbGV0 
>> YCBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuIFRoZXkgc2hvdWxkIGJlIHJlc2VydmVkIGZvciBj 
>> YXNlcyB3aGVuIHlvdSBtZWFuIHRvIHN0YXRlOiBfIkFsbCBvZiB0aGUgZm9sbG93aW5nIHNwZWNz 
>> IGluIHRoaXMgZ3JvdXAgcmVhbGx5ICoqbXVzdCoqIGhhdmUgdGhpcyAqKnNldHVwIGFjdGlvbioq 
>> IGRvbmUgYmVmb3JlIGVhY2ggb2YgdGhlbS4iXzwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxl 
>> PSJmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTNweDsiPjxicj48 
>> L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNl 
>> cmlmOyBmb250LXNpemU6IDEzcHg7Ij5Ob3RlIEkgd3JvdGUgInNldHVwIGFjdGlvbiIuIFRoaXMg 
>> ZG9lcyBub3QgYXBwbHkgdG8gYW55IGFjdGlvbiByZWdhcmRpbmcgdGhlIG9iamVjdCB1bmRlciB0 
>> ZXN0LiBJIHBlcnNvbmFsbHkgYmVsaWV2ZSB0aG9zZSBzaG91bGQgbm90IGJlIHB1dCBpbiBhbnkg 
>> YGJlZm9yZWAgYmxvY2ssIGJ1dCBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgc3BlYyBzbyB0aGF0 
>> IGl0IGlzIGNsZWFyIHdoYXQgeW91IGFyZSB0ZXN0aW5nLCB2ZXJzdXMgd2hhdCBpcyBzZXR0aW5n 
>> IHVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50LiBMZXQgbWUgc2hhcmUgYSBjb2RlIHNhbXBsZSBl 
>> eHBsYWluaW5nIHRoaXMgdmlldzo8L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC1m 
>> YW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzcHg7Ij48YnI+PC9zcGFuPjwv 
>> ZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsgZm9u 
>> dC1zaXplOiAxM3B4OyI+YGBgcnVieTwvc3Bhbj48L2Rpdj48ZGl2PjxkaXYgc3R5bGU9IiI+PGZv 
>> bnQgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPlJTcGVjLmRlc2NyaWJlIEFycmF5LCAibGlzdCBv 
>> ZiBlbGVtZW50cyIgZG88L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlh 
>> bCwgc2Fucy1zZXJpZiI+Jm5ic3A7IGRlc2NyaWJlICJwb3BwaW5nIHRoZSBhcnJheSIgZG88L2Zv 
>> bnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5i 
>> c3A7ICZuYnNwOyBsZXQoOmVsZW1lbnRfbGlzdCkgZG88L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0i 
>> Ij48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgWzpm 
>> aXJzdCwgOnNlY29uZCwgOmxhc3RdPC9mb250PjwvZGl2PjxkaXYgc3R5bGU9IiI+PGZvbnQgZmFj 
>> ZT0iYXJpYWwsIHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsgZW5kPC9mb250PjwvZGl2PjxkaXYg 
>> c3R5bGU9IiI+PGZvbnQgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPjxicj48L2ZvbnQ+PC9kaXY+ 
>> PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNw 
>> OyAjIFRoaXMgaXMgdGhlIHNhbWUgYXMgYmVmb3JlKDplYWNoKSBvciBiZWZvcmUoOmV4YW1wbGUp 
>> PC9mb250PjwvZGl2PjxkaXYgc3R5bGU9IiI+PGZvbnQgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYi 
>> PiZuYnNwOyAmbmJzcDsgYmVmb3JlIGRvPC9mb250PjwvZGl2PjxkaXYgc3R5bGU9IiI+PGZvbnQg 
>> ZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsgJm5ic3A7IGVsZW1lbnRfbGlz 
>> dC5wb3A8L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1z 
>> ZXJpZiI+Jm5ic3A7ICZuYnNwOyBlbmQ8L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBm 
>> YWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+PGJyPjwvZm9udD48L2Rpdj48ZGl2IHN0eWxlPSIiPjxm 
>> b250IGZhY2U9ImFyaWFsLCBzYW5zLXNlcmlmIj4mbmJzcDsgJm5ic3A7ICMgTm90ZSB3ZSBhcmUg 
>> KipjYW5ub3QqKiB1c2UgdGhlIHNhbWUgc2V0dXAgc3RhdGUgc2luY2Ugd2UgbmVlZCB0byBjYXB0 
>> dXJlPC9mb250PjwvZGl2PjxkaXYgc3R5bGU9IiI+PGZvbnQgZmFjZT0iYXJpYWwsIHNhbnMtc2Vy 
>> aWYiPiZuYnNwOyAmbmJzcDsgIyB0aGUgdmFsdWU8L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48 
>> Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNwOyBpdCAicmV0dXJucyB0 
>> aGUgbGFzdCB2YWx1ZSBvZiB0aGUgYXJyYXkiIGRvPC9mb250PjwvZGl2PjxkaXYgc3R5bGU9IiI+ 
>> PGZvbnQgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsgJm5ic3A7IGV4cGVj 
>> dChbOmZpcnN0LCA6c2Vjb25kLCA6bGFzdF0ucG9wKS50byBlcSg6bGFzdCk8L2ZvbnQ+PC9kaXY+ 
>> PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNw 
>> OyBlbmQ8L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1z 
>> ZXJpZiI+PGJyPjwvZm9udD48L2Rpdj48ZGl2IHN0eWxlPSIiPjxmb250IGZhY2U9ImFyaWFsLCBz 
>> YW5zLXNlcmlmIj4mbmJzcDsgJm5ic3A7ICMgTm90ZSBpdCdzIHZlcnkgdW5jbGVhciB3aGF0IHRo 
>> ZSB0ZXN0IGlzIGRvaW5nIGp1c3QgYnkgbG9va2luZyBhdCBpdC4gJm5ic3A7V2U8L2ZvbnQ+PC9k 
>> aXY+PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5ic3A7ICZu 
>> YnNwOyAjIGFyZSBkZXNjcmliaW5nIGFuIGFjdGlvbiBvbiBhbiBBcnJheSBpbnN0YW5jZS4gWWV0 
>> LCB0aGF0IGlzbid0IGNsZWFyIGZyb208L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBm 
>> YWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNwOyAjIHRoaXMgc3BlYyBhdCBhbGws 
>> IHNpbmNlIGFsbCB3ZSBzZWUgaXMgdGhhdCB3ZSBjaGVjayB0aGUgYXJyYXkgZWxlbWVudHM8L2Zv 
>> bnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+Jm5i 
>> c3A7ICZuYnNwOyBpdCAibXV0YXRlcyB0aGUgYXJyYXkgcmVtb3ZpbmcgdGhlIGxhc3QgZWxlbWVu 
>> dCIgZG88L2ZvbnQ+PC9kaXY+PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1z 
>> ZXJpZiI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgZXhwZWN0KGVsZW1lbnRfbGlzdCkudG8gZXEoWzpm 
>> aXJzdCwgOnNlY29uZF0pPC9mb250PjwvZGl2PjxkaXYgc3R5bGU9IiI+PGZvbnQgZmFjZT0iYXJp 
>> YWwsIHNhbnMtc2VyaWYiPiZuYnNwOyAmbmJzcDsgZW5kPC9mb250PjwvZGl2PjxkaXYgc3R5bGU9 
>> IiI+PGZvbnQgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPiZuYnNwOyBlbmQ8L2ZvbnQ+PC9kaXY+ 
>> PGRpdiBzdHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+ZW5kPC9mb250Pjwv 
>> ZGl2PjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJp 
>> ZjsgZm9udC1zaXplOiAxM3B4OyI+YGBgPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZv 
>> bnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxM3B4OyI+PGJyPjwvc3Bh 
>> bj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7 
>> IGZvbnQtc2l6ZTogMTNweDsiPkkndmUgc2VlbiB0aGUgYWJvdmUgY29kZSAiY2xlYW5lZCB1cCIg 
>> dG8gYmUgbW9yZSBleHByZXNzaXZlIGJ5IGNvbnZlcnRpbmcgaXQgaW50byBzb21ldGhpbmcgbGlr 
>> ZTo8L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5z 
>> LXNlcmlmOyBmb250LXNpemU6IDEzcHg7Ij48YnI+PC9zcGFuPjwvZGl2PjxkaXY+PGZvbnQgZmFj 
>> ZT0iYXJpYWwsIHNhbnMtc2VyaWYiPmBgYHJ1Ynk8L2ZvbnQ+PC9kaXY+PGRpdj48Zm9udCBmYWNl 
>> PSJhcmlhbCwgc2Fucy1zZXJpZiI+PGRpdj5SU3BlYy5kZXNjcmliZSBBcnJheSwgImxpc3Qgb2Yg 
>> ZWxlbWVudHMiIGRvPC9kaXY+PGRpdj4mbmJzcDsgZGVzY3JpYmUgInBvcHBpbmcgdGhlIGFycmF5 
>> IiBkbzwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBsZXQoOmFycmF5X3dpdGhfZWxlbWVudHMpIGRv 
>> PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwOyBbOmZpcnN0LCA6c2Vjb25kLCA6bGFzdF08 
>> L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgZW5kPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4mbmJz 
>> cDsgJm5ic3A7ICMgVGhpcyBpcyBpZGlvbSBpcyBvZnRlbiB2aWV3ZWQgYXMgYW4gaW1wbGljaXQg 
>> YGJlZm9yZWAuPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICM8L2Rpdj48ZGl2PiZuYnNwOyAmbmJz 
>> cDsgIyBFeGNlcHQsIGl0J3Mgbm90LiBJdCdzIG9ubHkgcnVuIG9uY2UgeW91IHNlbmQgdGhlIGBl 
>> bGVtZW50X2xpc3RgIG1lc3NhZ2UuPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICMgSWYgeW91IGRv 
>> IHRoaXMgaW4gdGhlIHdyb25nIHNwb3QgdGhlbiBpdCBtYXkgbGVhZCB0byBzdXJwcmlzaW5nIHRl 
>> c3RzLjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAjPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICMg 
>> VGhpcyBvZnRlbiBsZWFkcyBwZW9wbGUgdG8gdXNlIGJhbmcgZm9ybSBgc3ViamVjdCFgLCB3aGlj 
>> aCBpczwvZGl2Pjxka
>> ...
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/74f53f65-4389-4456-b8e6-f18ba532e745%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to