Ok. It's because of this: property :currency, Enum[*CURRENCY_CODES], :key => true
You can't have :key => true on an Enum property since it is not unique. On Jan 10, 11:22 pm, Zhi-Qiang Lei <[email protected]> wrote: > Hi, > > I still get the error with your spec code, here is the backtrace. > > Failures: > > 1) Loan#count! when a loan exists from giver to receiver > Failure/Error: Loan.count!(money_flow) > DataMapper::ImmutableError: > Immutable resource cannot be modified > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/r > esource/state/immutable.rb:16:in `set' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/m > odel/property.rb:251:in `amount=' > # ./lib/models.rb:49:in `count!' > # ./spec/models_spec.rb:64:in `block (4 levels) in <top (required)>' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li > b/rspec/matchers/change.rb:17:in `call' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li > b/rspec/matchers/change.rb:17:in `matches?' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li > b/rspec/expectations/handler.rb:34:in `handle_matcher' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li > b/rspec/expectations/extensions/kernel.rb:50:in `should_not' > # ./spec/models_spec.rb:63:in `block (3 levels) in <top (required)>' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:49:in `instance_eval' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:49:in `block (2 levels) in run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:98:in `with_around_hooks' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:46:in `block in run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:91:in `block in with_pending_capture' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:90:in `catch' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:90:in `with_pending_capture' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example.rb:45:in `run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example_group.rb:261:in `block in run_examples' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example_group.rb:257:in `map' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example_group.rb:257:in `run_examples' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example_group.rb:231:in `run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example_group.rb:232:in `block in run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example_group.rb:232:in `map' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/example_group.rb:232:in `run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/command_line.rb:27:in `block (2 levels) in run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/command_line.rb:27:in `map' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/command_line.rb:27:in `block in run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/reporter.rb:12:in `report' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/command_line.rb:24:in `run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/runner.rb:55:in `run_in_process' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/runner.rb:46:in `run' > # > /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ > core/runner.rb:10:in `block in autorun' > > On Jan 11, 2011, at 7:05 AM, RipTheJacker wrote: > > > > > > > You should probably just change that spec. The element that you want > > to test is a proc (you hope) getting invoked inside of the subject > > block, which is a weird pattern, and you don't need the #let blocks > > really, since you only use those objects once. > > > Try: > > > describe "#count!" do > > specify "when a loan exists from giver to receiver" do > > loan = Loan.gen > > money_flow = MoneyFlow.gen(:giver => loan.loaner, :receiver => > > loan.loanee, :currency => loan.currency) > > expect do > > Loan.count!(money_flow) > > end.to_not change(Loan, :count) > > end > > end > > > I'm assuming you are using rspec 2, though it will work in rspec 1.x > > with a syntax change. If you still get that error, post the new > > backtrace here. At the very least the spec and the backtrace will be > > more meaningful this way, and may be easier to debug (I hope). > > > On Jan 10, 10:42 am, Zhi-Qiang Lei <[email protected]> wrote: > >> Hi, > > >> I have some code as follow. > > >> class Loan > >> include DataMapper::Resource > >> belongs_to :loaner, Person, :key => true > >> belongs_to :loanee, Person, :key => true > >> property :currency, Enum[*CURRENCY_CODES], :key => true > >> property :amount, Decimal, :scale => 2, :default => 0 > > >> def self.count!(money_flow) > >> loan = get(money_flow.currency, money_flow.giver_id, > >> money_flow.receiver_id) > >> loan.amount += money_flow.amount > >> end > > >> # more code... > >> end > > >> class MoneyFlow > >> include DataMapper::Resource > >> belongs_to :giver, Person > >> belongs_to :receiver, Person > > >> property :id, Serial > >> property :amount, Decimal, :scale => 2, :min => 0.01 > >> property :currency, Enum[*CURRENCY_CODES], :default => :CNY > > >> # more code... > >> end > > >> When I test the "count!" class method as follow: > > >> describe "#count!" do > >> subject { lambda { Loan.count!(money_flow) } } > >> context "when a loan exists from giver to receiver" do > >> let!(:loan) { Loan.gen } > >> let(:money_flow) { MoneyFlow.gen(:giver => loan.loaner, :receiver => > >> loan.loanee, :currency => loan.currency) } > >> it { should_not change(Loan, :count) } > >> end > >> end > > >> It tells me I got a Immutable Error. I feel strange on that. They have > >> keys, and I didn't destroy the record. Can you see why? Thanks. > > >> 1) Loan#count! when a loan exists from giver to receiver > >> Failure/Error: subject { lambda { Loan.count!(money_flow) } } > >> DataMapper::ImmutableError: > >> Immutable resource cannot be modified > >> # ./lib/models.rb:49:in `count!' > >> # ./spec/models_spec.rb:59:in `block (4 levels) in <top (required)>' > >> # ./spec/models_spec.rb:63:in `block (4 levels) in <top (required)>' > > >> On Jan 10, 2011, at 11:34 PM, Ted Han wrote: > > >>> Objects are immutable when they've been deleted or frozen for some > >>> reason. Deleting a record from your data store will always result in > >>> that record being frozen. > > >>> Is there a specific problem that you're having? > > >>> -T > > >>> On Mon, Jan 10, 2011 at 10:23 AM, Zhi-Qiang Lei <[email protected]> > >>> wrote: > >>> Dear All, > > >>> Could anyone answer me when a resource should be immutable? And why? > >>> Thanks. > > >>> Best regards, > >>> Zhi-Qiang Lei > >>> [email protected] > > >>> -- > >>> You received this message because you are subscribed to the Google Groups > >>> "DataMapper" group. > >>> To post to this group, send email to [email protected]. > >>> To unsubscribe from this group, send email to > >>> [email protected]. > >>> For more options, visit this group > >>> athttp://groups.google.com/group/datamapper?hl=en. > > >>> -- > >>> You received this message because you are subscribed to the Google Groups > >>> "DataMapper" group. > >>> To post to this group, send email to [email protected]. > >>> To unsubscribe from this group, send email to > >>> [email protected]. > >>> For more options, visit this group > >>> athttp://groups.google.com/group/datamapper?hl=en. > > >> Best regards, > >> Zhi-Qiang Lei > >> [email protected] > > > -- > > You received this message because you are subscribed to the Google Groups > > "DataMapper" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]. > > For more options, visit this group > > athttp://groups.google.com/group/datamapper?hl=en. > > Best regards, > Zhi-Qiang Lei > [email protected] -- You received this message because you are subscribed to the Google Groups "DataMapper" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/datamapper?hl=en.
