1

私は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

しかし、それは失敗します:

) トークンが nil の場合の YouTube 失敗/エラー: it { 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:in `ブロック (3 レベル) in '

このテストで私がやろうとしているのは、 がいつ@tokennil で、が呼び出された@refresh場合に が供給されているかを判断することです。このモックとスタブは少し混乱します。refresh_auth_tokeninitialize

4

1 に答える 1

3

まず、any_instanceを使用します。

YouTube.any_instance.should_receive(:refresh_auth_token).with(data["refresh"])

現在、クラスメソッドrefresh_auth_tokenが呼び出されているかどうかを確認しています。存在しないので、そうではありません。

次に、コードがコンストラクターで実行されると、その行は呼び出しをキャッチしません。これは、オブジェクトが仕様の前の件名行で既に作成されているためです。

これが最も簡単な解決策です。

  context "when token is nil" do
    it "refreshed the authentation token" do
        YouTube.any_instance.should_receive(:refresh_auth_token).with(data["refresh"]) 
        YouTube.new(data["uid"], nil, data["refresh"]) 
    end
  end
于 2013-09-08T00:32:15.787 に答える