3

以下は、私の RSpec コード スニペットです。

describe UsersController do
  def mock_authentication_token(user, token_string)
    ...
    ...
  end

  def create_data
    @date_format = '%Y-%m-%d %H:%M:%S'
    today = Time.now
    @today_str = today.strftime(@date_format)
    ...
    ..
    ..
  end

  before do
    @current_user = Factory(:client)
    authtoken_str = "client auth token string"
    mock_authentication_token(@current_user, authtoken_str)
  end

  context "action: index" do
    before do
      create_data
      @params = @params.merge(limit: 5)
    end

    it "should return the more link with date set to 1 second ahead of #{@today_str}" do
      get :index, @params

      body = JSON.parse response.body

      ...
      ...
      ...
    end
end

この例では、「#{@today_str} の 1 秒前に日付が設定された more リンクを返す必要があります」が失敗した場合、失敗した例の説明で、ヘルパー メソッドcreate_dataによって設定されたインスタンス変数 @today_str の値を出力しません。

印刷するだけです:日付が1秒先に設定された詳細リンクを返す必要があります

このメソッドは文字列補間を許可しいないようです。これは本当ですか? はいの場合、どうすれば目的の動作を実現できますか。

ありがとう、ジグネッシュ

4

1 に答える 1

1

Rspec は@、各itブロックの後にクラス インスタンス変数をリセットします。

例えば:

describe 'it blocks' do

  before :all
    @reset = 0
    @@global = 'will break tests'
  end

  it 'should increment' do
    @reset += 1
  end

  it "shouldn't forget it, either" do
    # but it does
    @reset.should eql 0
  end

  it 'does remember class-level variables, though' do
    @@global += ' for sure'
  end

  it 'can be demonstrated via' do
    @@global.split(' ').should > 3
  end

  # this is not the same @reset as what's in `before :all`.
  this_is_blank = @reset
  it "won't interpolate #{this_is_blank} because it's an instance level variable" do
    true.should be true
  end

  local = 'might as well hard code them into your descriptions at this point'
  it "Doesn't matter anymore because you #{local}" do
    true.should eql true
  end

  it "won't get here because class-level variables #{@@global}" do
    (2 + 2).should eql 5
  end

end

仕様テストにもっと一般的な名前を付ける必要があるようです。とにかく、私は持っています。

于 2013-09-26T18:24:39.257 に答える