我正在写一个程序,允许用户匹配交易中的订单,最终在它们之间传递事物。rspec平等匹配失败,对象看起来是一样的
我有一个类,TransferAsset,这需要一个事务,并创建了一个资产进行交易的买方:
class TransferAsset
attr_accessor :transaction, :seed_asset
def initialize(opts = {})
@transaction = opts[:transaction]
end
def create_seed_asset
@seed_asset = UserInventoryFactory.new({transaction: transaction}).inventory
end
end
这里的UserInventory类:
class UserInventoryFactory
attr_accessor :transaction, :inventory
def initialize(opts = {})
@transaction = opts[:transaction]
create_user_inventory
set_values
end
def set_values
set_seed_transaction
set_owner
set_amount
set_purchase_date
set_initial_amount
end
def create_user_inventory
@inventory = UserInventory.new
end
def set_seed_transaction
inventory.seed_transaction_id = transaction.id
end
def set_owner
inventory.user_id = transaction.buyer_id
end
def set_amount
inventory.amount = transaction.amount
end
def set_purchase_date
inventory.purchase_date = transaction.created_at.beginning_of_day
end
def set_initial_amount
inventory.initial_amount = transaction.amount
end
end
我有一个RSpec测试的TransferAsset等级:
describe '#create_seed_asset' do
it 'creates an asset for the purchaser' do
factory = UserInventoryFactory.new({transaction: transaction})
expect(transfer.create_seed_asset).to eql factory.inventory
end
end
测试失败,因为:
1) TransferAsset#create_seed_asset creates an asset for the purchaser
Failure/Error: expect(transfer.create_seed_asset).to eql factory.inventory
expected: #<UserInventory id: nil, amount: 5000.0, initial_amount: 5000.0, purchase_date: "2014-06-22 05:00:00", user_id: 2, seed_transaction_id: 1, created_at: nil, updated_at: nil>
got: #<UserInventory id: nil, amount: 5000.0, initial_amount: 5000.0, purchase_date: "2014-06-22 05:00:00", user_id: 2, seed_transaction_id: 1, created_at: nil, updated_at: nil>
(compared using eql?)
我已经尝试了所有的RSpec的平等匹配器,它总是失败,这让我觉得我写不好的代码,无论是在我的测试,或在我的实际类。
我在做什么错,或者我能做得更好?
不知道我明白。假设我做了以下操作:'a ='string'','b ='string''。现在,'a == b#=> true',但是,'a.object_id!= b.object_id#=> true'。在这种情况下,两个不同的对象通过'=='被认为是相同的,而不具有相同的对象ID。这与你写的是否矛盾? – garythegoat
@garythegoat - 不,因为String实现_overrides_的==行为 - 请参见[here](http://ruby-doc.org//core-2.2.0/String.html#method-i-3D- 3D) –
哦,很酷,谢谢! – garythegoat