I already had a quick look at VCR before. I always thought that it's best for replaying real http content. I am looking at faking web content dependent on the time. However, I might be able to "bend" VCR to suite my needs. Thanks for the suggestion!
2015-06-26 17:10 GMT+02:00 Myron Marston <[email protected]>: > On Fri, Jun 26, 2015 at 3:02 AM, JSchlinker <[email protected]> > wrote: > >> I am using Rspec to test a module that has an external dependency with >> the Internet. >> This is why I am trying to mock out the class that handles the actual >> access of the webpage when running my tests. >> >> My class "Snapshot" (that I want to test) accesses a webpage when it is >> requested and will save the html in a file when the hash of the content has >> changed. >> The filename should have a certain name according to the date/time and a >> running number. >> And there should be a log message when an error occours (e.g. no Internet >> or website down), containing the status code (e.g. 404). >> >> I made some basic tests, but now wanted to write a test integrating a >> couple of classes. >> The only thing that I would like to mock is the Internet part. >> As the snapshots are only generated when the html content changes I >> thought about the following approach: >> >> - Use timecop to fake a time and be able to check if the saved filename >> corresponds to this date/time >> - Mock the class "Internet" by specifying certain time spans in which the >> class should return a certain content >> >> My class under test looks like this: >> >> class Snapshot < ActiveRecord::Base >> >> def self.grab_website(uri) >> response, content = Internet.access_webpage(uri) >> # code that calculates the hash, saves the content or generates >> an error log messages >> end >> >> end >> >> >> My Rspec "preparation code" for mocking the class Internet looks like >> this: >> >> stub_const("Internet::WEBSITE_REPLIES", \ >> { "http://www.thiswebsiteisimportanttome.com" => \ >> [["2015-06-12 15:30", "website_Version_A.html"] ,\ >> ["2015-06-14 18:00", "website_Version_B.html"] ,\ >> ["2015-06-14 18:50", 404] ,\ >> ["2015-06-14 19:00", "website_Version_C.html"] ,\ >> ["2015-06-26 11:35", "website_Version_D.html"]] } ) >> >> allow(Internet).to receive(:access_webpage) do |uri| >> time = Time.now >> content = nil >> response_code = 0 # We're not connected to the internet >> >> if Internet::WEBSITE_REPLIES.has_key?(uri) >> filename = nil >> timetable = Internet::WEBSITE_REPLIES[uri] >> timetable.each do |timepoint_situation| >> timepoint = Time.parse(timepoint_situation[0]) >> if time > timepoint >> filename = timepoint_situation[1] >> end >> end >> if (filename.nil?) >> response_code = 0 >> elsif (filename.kind_of? Integer) >> response_code = filename >> else # filename is really a filename >> content = File.read(filename) >> response_code = 200 >> end >> end >> next response_code, content >> end >> >> >> And my actual test looks like this: >> >> first_time = Time.local(2015, 6, 12, 15, 35) >> second_time = Time.local(2015, 6, 14, 17, 00) >> third_time = Time.local(2015, 6, 14, 18, 05) >> >> uri = "http://www.thiswebsiteisimportanttome.com" >> Timecop.freeze(first_time) # Version A >> Snapshot.grab_website(uri) >> >> Timecop.freeze(second_time) # Version A (no changes) >> Snapshot.grab_website(uri) >> >> Timecop.freeze(third_time) # Version B >> Snapshot.grab_website(uri) >> >> snapshots = Snapshot.all >> expect(snapshots.size).to eq(2) >> >> snapshot = snapshots[0] >> expect(snapshot.time).to eq(first_time) >> expect(snapshot.hash).to eq("234092384EF") >> expect(snapshot.filename).to eq(...) >> >> snapshot = snapshots[1] >> expect(snapshot.time).to eq(third_time) >> expect(snapshot.hash).to eq("A8E92340213") >> expect(snapshot.filename).to eq(...) >> >> # work to do: check the log messages ... >> >> >> I have the feeling that there should be an easier way to do this. >> Especially because I can't imagine that I'm the only one that wants to >> test time dependent Website content. >> I am grateful for any suggestions! >> >> J. >> >> -- >> 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/c1ed74fa-8f54-40ae-a6ba-ccfab2584bc1%40googlegroups.com >> <https://groups.google.com/d/msgid/rspec/c1ed74fa-8f54-40ae-a6ba-ccfab2584bc1%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > > Take a look at VCR <https://relishapp.com/vcr/vcr/docs>. It is > specifically designed for when you are testing HTTP-dependent code. > > > -- > You received this message because you are subscribed to a topic in the > Google Groups "rspec" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/rspec/dqkIqrX5Vgo/unsubscribe. > To unsubscribe from this group and all its topics, 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/CADUxQmtt_vrq%2BRTbNHC%2BE%2BRTAubATaQrz26my7Dtd8FVKx0Yqw%40mail.gmail.com > <https://groups.google.com/d/msgid/rspec/CADUxQmtt_vrq%2BRTbNHC%2BE%2BRTAubATaQrz26my7Dtd8FVKx0Yqw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- 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/CALp6bixYJXsCpgwUm7c8Dgv7bn4U--yF84yqgmDu20wWT-jJ2w%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
