如何测试依赖于 RSpec 和 Sinatra 关联的 class 方法?
How to test class methods that rely on associations with RSpec and Sinatra?
我已经编写了一些 RSpec 测试,它们使用 :let 语句成功创建了对象。但是,测试环境不会维护在其他任何地方都能正常运行的关联。下面是一个 class 的例子,它会出现 NoMethodError(nil:NilClass 的未定义方法 `money')。 Money 是 Inventory 中的一列。有什么想法吗?
class Inventory < ActiveRecord::Base
belongs_to :character
def self.return_money(character)
character.inventory.money
end
end
下面是规范文档的相应示例:
require 'spec_helper'
describe 'Test methods' do
let(:trader) {
Character.create(
name: "Trader",
location_id: 1)
}
let(:trader_inventory) {
Inventory.create(
character_id: trader.id,
storage_capacity: 50000,
money: 20000,
markup: 1.35)
}
it "test method" do
expect(Inventory.return_money(trader)).to eq(100)
end
end
没有理由这不起作用。 RSpec 并不特殊,只是普通的 Ruby 代码。您可以通过将所有代码移动到一个文件中来确认这一点,例如:
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
ActiveRecord::Base.logger = Logger.new(STDOUT)
class Inventory < ActiveRecord::Base
end
class Character < ActiveRecord::Base
has_one :inventory
end
describe 'test' do
it 'works' do
puts Character.first.inventory.money.inspect
end
end
猜测什么可能坏了:
money
是一个复合字段或类似的东西。你能post你的数据库模式吗?
- 库文件加载不正确。使用
puts $LOADED_FEATURES
验证所有应该需要的文件都已经存在。
我已经编写了一些 RSpec 测试,它们使用 :let 语句成功创建了对象。但是,测试环境不会维护在其他任何地方都能正常运行的关联。下面是一个 class 的例子,它会出现 NoMethodError(nil:NilClass 的未定义方法 `money')。 Money 是 Inventory 中的一列。有什么想法吗?
class Inventory < ActiveRecord::Base
belongs_to :character
def self.return_money(character)
character.inventory.money
end
end
下面是规范文档的相应示例:
require 'spec_helper'
describe 'Test methods' do
let(:trader) {
Character.create(
name: "Trader",
location_id: 1)
}
let(:trader_inventory) {
Inventory.create(
character_id: trader.id,
storage_capacity: 50000,
money: 20000,
markup: 1.35)
}
it "test method" do
expect(Inventory.return_money(trader)).to eq(100)
end
end
没有理由这不起作用。 RSpec 并不特殊,只是普通的 Ruby 代码。您可以通过将所有代码移动到一个文件中来确认这一点,例如:
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
ActiveRecord::Base.logger = Logger.new(STDOUT)
class Inventory < ActiveRecord::Base
end
class Character < ActiveRecord::Base
has_one :inventory
end
describe 'test' do
it 'works' do
puts Character.first.inventory.money.inspect
end
end
猜测什么可能坏了:
money
是一个复合字段或类似的东西。你能post你的数据库模式吗?- 库文件加载不正确。使用
puts $LOADED_FEATURES
验证所有应该需要的文件都已经存在。