<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,20 +1,28 @@
+require 'activesupport'
+
 module Stubble
   class ParameterMismatchError &lt; StandardError
   end
-  
+
+  class NoAccessError &lt; StandardError
+    def initialize(*args)
+      super(&quot;Model was never accessed&quot;)
+    end
+  end
+
   include Unimock
-  
+
   module IdentifiableModel
     def with_id(id)
       self.id = id
       self
     end
-    
+
     def new_record?
       !id
     end
   end
-  
+
   module ValidModel # :nodoc:
     include IdentifiableModel
     class &lt;&lt; self
@@ -26,7 +34,7 @@ module Stubble
       end
     end
   end
-  
+
   module InvalidModel # :nodoc:
     include IdentifiableModel
     class &lt;&lt; self
@@ -41,55 +49,77 @@ module Stubble
       end
     end
   end
-  
+
   @@model_id = 1000
-  
+
   def next_id
     @@model_id += 1
   end
-  
+
   def build_stubs(klass, options={}) # :nodoc:
+    $current_stubble = {}
     options = {:as =&gt; :valid}.merge(options)
     instance_id = options[:id] ? options[:id].to_i : next_id
-    
+
     instance = klass.new
 
     if options[:as] == :valid
       instance.extend(ValidModel)
-      stub_and_invoke(klass, :create) {|*params| generate_instance(instance.with_id(instance_id), options, params.first)}
-      stub_and_invoke(klass, :create!) {|*params| generate_instance(instance.with_id(instance_id), options, params.first)}
+      stub_and_invoke(klass, :create) do |*params|
+        __record_stubbled_klass_access
+        __generate_stubble_instance(instance.with_id(instance_id), options, params.first)
+      end
+      stub_and_invoke(klass, :create!) do |*params|
+        __record_stubbled_klass_access
+        __generate_stubble_instance(instance.with_id(instance_id), options, params.first)
+      end
     else
       instance.extend(InvalidModel)
-      stub_and_invoke(klass, :create) {instance.with_id(nil)}
-      stub_and_raise(klass, :create!, ActiveRecord::RecordInvalid.new(instance))
+      stub_and_invoke(klass, :create) do
+        __record_stubbled_klass_access
+        instance.with_id(nil)
+      end
+      stub_and_invoke(klass, :create!) do
+        __record_stubbled_klass_access
+        raise ActiveRecord::RecordInvalid.new(instance)
+      end
     end
 
-    stub_and_invoke(klass, :new) {|*params| generate_instance(instance.with_id(nil), options, params.first)}
-    stub_and_return(klass, :all, [instance.with_id(instance_id)])
+    instance.with_id(instance_id)
+
+    stub_and_invoke(klass, :new) do |*params|
+      __record_stubbled_klass_access
+      __generate_stubble_instance(instance.with_id(nil), options, params.first)
+    end
     stub_and_invoke(klass, :find) do |*args|
+      __record_stubbled_klass_access
       args.first == :all ? [instance.with_id(instance_id)] :
         args.first.to_i == instance_id ? instance.with_id(instance_id) :
           (raise ActiveRecord::RecordNotFound.new(instance))
     end
+    stub_and_invoke(klass, :all) { klass.find(:all) }
 
     instance
   end
-  
-  def generate_instance(instance, opts, params)
+
+  def __record_stubbled_klass_access
+    $current_stubble[:accessed] = true
+    yield if block_given?
+  end
+
+  def __generate_stubble_instance(instance, opts, params)
     if opts[:params]
-      expected, actual = stringify_keys(opts[:params]), stringify_keys(params)
+      expected = opts[:params].stringify_keys
+      actual   = params ? params.stringify_keys : nil
       raise ParameterMismatchError.new(&quot;Expected params: #{expected.inspect}\n            got: #{actual.inspect}&quot;) unless expected == actual
     end
     return instance
   end
-  
-  def stringify_keys(hash)
-    hash.inject({}) do |options, (key, value)|
-      options[key.to_s] = value
-      options
-    end
+
+  def __verify_stubble
+    raise NoAccessError.new unless $current_stubble[:accessed]
   end
-  
+
   # :call-seq:
   #   stubbing(Thing)                 {|thing| ... }
   #   stubbing(Thing, :as =&gt; invalid) {|thing| ... }
@@ -99,6 +129,7 @@ module Stubble
   def stubbing(klass, options={:as =&gt; :valid})
     instance = build_stubs(klass, options)
     yield instance
+    __verify_stubble
     reset
   end
-end
\ No newline at end of file
+end</diff>
      <filename>lib/stubble/stubbing.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@ module Mocha
 end
 
 module Unimock
-  include Mocha::Standalone
+  include Mocha::API
   
   def stub_and_return(obj, method, value)
     obj.stubs(method).returns(value)</diff>
      <filename>lib/unimock/mocha.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ module Unimock
   def stub_and_invoke(obj, method, &amp;block)
     obj.stub(method, &amp;block)
   end
-
+  
   def reset
     $rspec_mocks.reset_all
   end</diff>
      <filename>lib/unimock/rspec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,6 +28,15 @@ def raises_when_params_dont_match(method)
         end.to raise_error(Stubble::ParameterMismatchError, &quot;Expected params: {\&quot;this\&quot;=&gt;:that}\n            got: {\&quot;this\&quot;=&gt;:other}&quot;)
       end
     end
+    
+    context &quot;but no creation method is received&quot; do
+      it &quot;raises&quot; do
+        model = build_stubs(Model, :params =&gt; {:this =&gt; :that})
+        expect {__verify_stubble}.to raise_error(
+          Stubble::NoAccessError
+        )
+      end
+    end
   end
 end
 
@@ -237,17 +246,77 @@ end
 context &quot;stubbing&quot; do
   it &quot;yields the instance&quot; do
     stubbing(Model) do |model|
+      Model.create # to suppress NoAccessError
       model.should_not be_nil
     end
   end
-
+ 
   it &quot;tears down the stubs&quot; do
     model = nil
     stubbing(Model) do
+      Model.create # to suppress NoAccessError
       def reset
         $reset_called = true
       end
     end
     $reset_called.should be_true
   end
+  
+  context &quot;as valid&quot; do
+    context &quot;with new call&quot; do
+      it &quot;does not raise NoAccess&quot; do
+        stubbing(Model) do |model|
+          Model.new
+        end
+      end
+    end
+    context &quot;with find call&quot; do
+      it &quot;does not raise NoAccess&quot; do
+        stubbing(Model) do |model|
+          Model.find(model.id)
+        end
+      end
+    end
+    context &quot;with all call&quot; do
+      it &quot;does not raise NoAccess&quot; do
+        stubbing(Model) do |model|
+          Model.all
+        end
+      end
+    end
+    context &quot;with create call&quot; do
+      it &quot;does not raise NoAccess&quot; do
+        stubbing(Model) do |model|
+          Model.create
+        end
+      end
+    end
+    context &quot;with create! call&quot; do
+      it &quot;does not raise NoAccess&quot; do
+        stubbing(Model) do |model|
+          Model.create!
+        end
+      end
+    end
+  end
+
+  context &quot;as invalid&quot; do
+    context &quot;with create call&quot; do
+      it &quot;does not raise NoAccess&quot; do
+        stubbing(Model, :as =&gt; :invalid) do |model|
+          Model.create
+        end
+      end
+    end
+    context &quot;with create! call&quot; do
+      it &quot;does not raise NoAccess&quot; do
+        stubbing(Model, :as =&gt; :invalid) do |model|
+          begin
+            Model.create!
+          rescue ActiveRecord::RecordInvalid
+          end
+        end
+      end
+    end
+  end
 end</diff>
      <filename>spec/stubble/stubbing_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>261873a6c96d6118bc97edce1d2074ad37e51522</id>
    </parent>
  </parents>
  <author>
    <name>David Chelimsky</name>
    <email>dchelimsky@gmail.com</email>
  </author>
  <url>http://github.com/dchelimsky/stubble/commit/135c64a8a449923aa399e1b251ae0acccfbba045</url>
  <id>135c64a8a449923aa399e1b251ae0acccfbba045</id>
  <committed-date>2009-09-14T22:36:13-07:00</committed-date>
  <authored-date>2009-09-14T22:36:13-07:00</authored-date>
  <message>stubble barks if never accessed</message>
  <tree>f78555d503591c9cdccf53fd4fa20369adf165fe</tree>
  <committer>
    <name>David Chelimsky</name>
    <email>dchelimsky@gmail.com</email>
  </committer>
</commit>
