使用 Rspec,我如何测试从 ruby 中的另一个 class 调用方法的方法
Using Rspec, how can I test a method which calls a method from another class in ruby
我的交易 class 有一个方法 'balance' 从我的帐户 class 调用方法 'balance_after'。我想做一个测试,我可以检查 'balance_after' 方法是否被 'balance' 方法调用。我对 ruby 和测试都是新手,所以非常感谢任何指导!我正在使用 simple-cov 来获得覆盖率,如果可能的话,我想达到 100%。我希望我已经提供了足够的信息。提前致谢!
Failures:
1) Transaction#balance checks balance
Failure/Error: @account.balance_after(self)
NoMethodError:
undefined method `balance_after' for :account:Symbol
# ./lib/transaction.rb:11:in `balance'
# ./spec/transaction_spec.rb:19:in `block (3 levels) in <top (required)>'
Finished in 0.04089 seconds (files took 0.87223 seconds to load)
10 examples, 1 failure
Failed examples:
rspec ./spec/transaction_spec.rb:18 # Transaction#balance checks balance
COVERAGE: 98.55% -- 68/69 lines in 4 files
+----------+--------------------+-------+--------+---------+
| coverage | file | lines | missed | missing |
+----------+--------------------+-------+--------+---------+
| 90.91% | lib/transaction.rb | 11 | 1 | 16 |
+----------+--------------------+-------+--------+---------+
我的交易class
class Transaction
attr_reader :amount, :account, :timestamp
def initialize(amount, account)
@amount = amount
@account = account
@timestamp = Time.now.strftime("%d/%m/%Y")
end
def balance
@account.balance_after(self)
end
def formate
@amount > 0 ? (puts "#{@timestamp}|| #{@amount} || || #{balance}")
: (puts "#{@timestamp}|| || #{@amount.abs} || #{balance}")
end
end
我的账户class
require_relative 'transaction'
class Account
attr_reader :balance, :transactions
HEADER = 'date || credit || debit || balance'
def initialize
@balance = 0
@transactions = []
end
def deposit(amount)
@balance += amount
@transactions << Transaction.new(amount, self)
end
def withdraw(amount)
@balance -= amount
@transactions << Transaction.new(-amount, self)
end
def balance_after(transaction)
index = @transactions.find_index(transaction)
@transactions[0..index].map(&:amount).sum
end
def print_statement
puts HEADER
@transactions.reverse.map(&:formate)
end
end
我的交易规范
require 'transaction'
describe Transaction do
let(:transaction) { Transaction.new(:amount, :account) }
let(:timestamp) { Time.now.strftime('%d/%m/%Y') }
describe '#initilalize' do
it 'validates class' do
expect(transaction).to be_a Transaction
end
it 'stores dates' do
expect(transaction.timestamp).to eq timestamp
end
end
describe '#balance' do
it 'checks balance' do
expect(transaction.balance).to eq true
end
end
end
您必须正确调用该方法。 Transaction.new
需要一个金额,大概是一个数字,以及某种定义了 balance_after
的 Account 对象。你给了它两个符号。
describe Transaction do
let(:account) { Account.new }
let(:amount) { 1.23 }
let(:transaction) { Transaction.new(amount, account) }
let(:timestamp) { Time.now.strftime('%d/%m/%Y') }
然后检查它是否return符合您的预期。 balance
不 return 真假,它 return 是一个平衡。具体来说,它只是通往 account.balance_after(transaction)
的通道,因此请对其进行测试。
describe '#balance' do
it 'checks balance' do
expect(transaction.balance).to eq account.balance_after(transaction)
end
end
这似乎是循环的,但这只是一个集成测试。 account.balance_after
将作为帐户测试的一部分进行单元测试。无需在此处重复这些测试。
我的交易 class 有一个方法 'balance' 从我的帐户 class 调用方法 'balance_after'。我想做一个测试,我可以检查 'balance_after' 方法是否被 'balance' 方法调用。我对 ruby 和测试都是新手,所以非常感谢任何指导!我正在使用 simple-cov 来获得覆盖率,如果可能的话,我想达到 100%。我希望我已经提供了足够的信息。提前致谢!
Failures:
1) Transaction#balance checks balance
Failure/Error: @account.balance_after(self)
NoMethodError:
undefined method `balance_after' for :account:Symbol
# ./lib/transaction.rb:11:in `balance'
# ./spec/transaction_spec.rb:19:in `block (3 levels) in <top (required)>'
Finished in 0.04089 seconds (files took 0.87223 seconds to load)
10 examples, 1 failure
Failed examples:
rspec ./spec/transaction_spec.rb:18 # Transaction#balance checks balance
COVERAGE: 98.55% -- 68/69 lines in 4 files
+----------+--------------------+-------+--------+---------+
| coverage | file | lines | missed | missing |
+----------+--------------------+-------+--------+---------+
| 90.91% | lib/transaction.rb | 11 | 1 | 16 |
+----------+--------------------+-------+--------+---------+
我的交易class
class Transaction
attr_reader :amount, :account, :timestamp
def initialize(amount, account)
@amount = amount
@account = account
@timestamp = Time.now.strftime("%d/%m/%Y")
end
def balance
@account.balance_after(self)
end
def formate
@amount > 0 ? (puts "#{@timestamp}|| #{@amount} || || #{balance}")
: (puts "#{@timestamp}|| || #{@amount.abs} || #{balance}")
end
end
我的账户class
require_relative 'transaction'
class Account
attr_reader :balance, :transactions
HEADER = 'date || credit || debit || balance'
def initialize
@balance = 0
@transactions = []
end
def deposit(amount)
@balance += amount
@transactions << Transaction.new(amount, self)
end
def withdraw(amount)
@balance -= amount
@transactions << Transaction.new(-amount, self)
end
def balance_after(transaction)
index = @transactions.find_index(transaction)
@transactions[0..index].map(&:amount).sum
end
def print_statement
puts HEADER
@transactions.reverse.map(&:formate)
end
end
我的交易规范
require 'transaction'
describe Transaction do
let(:transaction) { Transaction.new(:amount, :account) }
let(:timestamp) { Time.now.strftime('%d/%m/%Y') }
describe '#initilalize' do
it 'validates class' do
expect(transaction).to be_a Transaction
end
it 'stores dates' do
expect(transaction.timestamp).to eq timestamp
end
end
describe '#balance' do
it 'checks balance' do
expect(transaction.balance).to eq true
end
end
end
您必须正确调用该方法。 Transaction.new
需要一个金额,大概是一个数字,以及某种定义了 balance_after
的 Account 对象。你给了它两个符号。
describe Transaction do
let(:account) { Account.new }
let(:amount) { 1.23 }
let(:transaction) { Transaction.new(amount, account) }
let(:timestamp) { Time.now.strftime('%d/%m/%Y') }
然后检查它是否return符合您的预期。 balance
不 return 真假,它 return 是一个平衡。具体来说,它只是通往 account.balance_after(transaction)
的通道,因此请对其进行测试。
describe '#balance' do
it 'checks balance' do
expect(transaction.balance).to eq account.balance_after(transaction)
end
end
这似乎是循环的,但这只是一个集成测试。 account.balance_after
将作为帐户测试的一部分进行单元测试。无需在此处重复这些测试。