我是TDD和 Rspec
的新手 . 我试图找出如何确保在测试中调用方法:
module Authentication
include WebRequest
def refresh_auth_token(refresh_token)
"refreshing token"
end
end
class YouTube
include Authentication
attr_accessor :uid, :token, :refresh
def initialize(uid, token, refresh)
@uid = uid
@token = token
@refresh = refresh
# if token has expired, get new token
if @token == nil and @refresh
@token = refresh_auth_token @refresh
end
end
end
这是我的测试:
$f = YAML.load_file("fixtures.yaml")
describe YouTube do
data = $f["YouTube"]
subject { YouTube.new(data["uid"], data["token"], data["refresh"]) }
its(:token) { should == data["token"] }
context "when token is nil" do
subject(:without_token) { YouTube.new(data["uid"], nil, data["refresh"]) }
its(:token) { should_not be_nil }
it { YouTube.should_receive(:refresh_auth_token).with(data["refresh"]) }
end
end
但它失败了:
)令牌为零时的YouTube失败/错误:{YouTube.should_receive(:refresh_auth_token).with(data [“refresh”])}() . refresh_auth_token(“1 / HBTNQ93otm1cSQH8kKauij3jO0kZQYfgH5J-hBtAP8k”)预期:1次带参数:(“1 / HBTNQ93otm1cSQH8kKauij3jO0kZQYfgH5J-hBtAP8k”)收到:带参数的0次:(“1 / HBTNQ93otm1cSQH8kKauij3jO0kZQYfgH5J-hBtAP8k”)# . / lib / youtube / you_tube_test.rb:14:在'块(3级)中'
我在这个测试中尝试做的是确定 @token
是否为零,并且如果在 initialize
上调用 refresh_auth_token
,则提供 @refresh
. 这种模拟和存根的事情有点令人困惑 .
1 回答
首先,您要使用any_instance:
目前,您正在检查是否正在调用类方法
refresh_auth_token
. 它不存在于_778452中 .接下来,当代码在构造函数中执行时,该行将不会捕获调用,因为该对象已在规范之前的主题行中创建 .
这是最简单的解决方案: