I have a book model that is a ruby โโscript that prices certain predefined book names mentioned in the program. Here's what the book model looks like: -
class Book attr_accessor :books def initialize books puts "Welcome to setting book price program" @books = books end def get_prices puts "Please enter appropriate price for each book item:-" count = 0 @books = @books.inject({}) { |hash, book| print "#{book.first}: " price = STDIN.gets.chomp while (price !~ /^[1-9]\d*$/ && price != "second hand") puts "Price can't be 0 or a negative integer or in decimal format or alphanumeric. \nPlease input appropriate price in integer" price = STDIN.gets.chomp #gets.chomp - throws error end price == "second hand" ? price = "100" : price #takes a default price hash[book.first] = price.to_i hash } end end books = {"The Last Samurai" => nil, "Ruby Cookbook" => nil, "Rails Recipes" => nil, "Agile Development with Rails" => nil, "Harry Potter and the Deathly Hallows" => nil} book_details = Book.new(books) book_details.get_prices puts "\n*******Books Details:#{book_details.books}******\n"
I am trying to write a test case that verifies that the price is entered correctly for each element of the book. If the price is entered incorrectly, it should ask the user to enter the price correctly. The program does an excellent job. But I encounter difficulties when I try to mock this behavior with RSpec.
require 'spec_helper' describe Book do before :each do books = {"The Last Samurai" => nil, "Ruby Cookbook" => nil, "Rails Recipes" => nil, "Agile Development with Rails" => nil, "Harry Potter and the Deathly Hallows" => nil} @book = Book.new(books) end describe "#new" do it "Should be an instance of the Book" do @book.should be_an_instance_of Book end end describe "#getprice" do it "Should get the price in the correct format or else return appropriate error" do puts "\n************************************************************************\n" book_obj = @book STDOUT.should_receive(:puts).and_return("Welcome to setting book price program") book_obj.get_prices.should_not be_nil book_obj.books["The Last Samurai"].stub!(:gets) {"40"}
You can even clone this code from Github to try it on your part. I am using Ruby 1.9.3 and rspec 2.11.0
The error that I'm getting currently is:- Failures: 1) Book
UPDATE QUESTION
If the user is entered incorrectly, with the test case below, I get the following error. How can I handle this correctly? I tried several options, but all of them seem to fail. Please see the Comment for each parameter as part of a specification fragment.
it "Incorrect input format should return error message asking user to re input" do puts "\n************************************************************************\n" book_obj = @book STDIN.stub(:gets) { "40abc" }
I would really appreciate any guidance on how to do this correctly. Thanks.