0

railscasts.com でカミナリに関するエピソードを見て、このシステムをブログに追加しようとしました。しかし、このエラーが何度も表示され、その理由がわかりません。

投稿コントローラーからのインデックス アクション:

  def index
@posts = Post.order("title").page(params[:page]).per(3)

if params[:tag]
  @posts = Post.tagged_with(params[:tag])
else
  @posts = Post.all
end

respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @posts }
  end
end

ファイルを表示: index.html.erb:

<%= paginate @posts%>

<% @posts.each do |post| %>

<h2><%= link_to post.title, post %></h2>
  <p>
    Created: <%= post.created_at.strftime("%Y/%m/%d")%> by
     <%=  link_to post.user.fullname, user_posts_path(post.user) %>
  </p>

  <p>
  <%= simple_format post.text %>
  </p>

  <p>
Tags: <%= raw post.tag_list.map { |t| link_to t, tag_path(t) }.join(', ')      %>
  </p>

  <% end %>

ソースを掘り下げるのにかなりの時間を費やした後、「複数のブラウザー」シナリオの解決策を見つけました。複数のブラウザーに関する chapmatic の主張と与えられた答えは確かに正しかった: $browsers 配列に複数のブラウザーが定義されている場合、並列テストでは機能せず、同じブラウザーを数回実行します。このソリューションでは引き続き環境変数を使用しますが、$browsers 配列を引き続き使用する必要があります。

したがって、まず抽象テスト クラスで $browsers 配列を定義してください。次に、env var BROWSER を定義し、テストするブラウザを割り当てたとします。Sauce\Sausage\WebDriverTestCase を拡張する抽象テスト クラスで、次の静的関数を設定できます。

    public static function browserSetup()
    {   
        switch (getenv('BROWSER')) {
            case 'firefox':
                self::$browsers = array(
                    array(
                        'browserName' => 'firefox',
                        'desiredCapabilities' => array(
                            'platform' => 'self::WIN_VERSION',
                            'version' => self::FIREFOX_VERSION,
                        )   
                    )   
                );  
                break;

            case 'safari':
                //safari desiredCapabilities
               break;

            case 'explorer':
                //ie desiredCapabilities
               break;

           case 'chrome':
             //chrome desiredCapabilities

           default: //This will just use the default $browsers array you defined
         return;
    }

browserSetup() が定義されたので、BROWSER 環境変数で指定したブラウザーでのみテストが実行されるように設定されるように、テスト スイートがセットアップされる前に呼び出されることを確認する必要があります。Sauce\Sausage\WebDriverTestCase によって消費される PHPUnit_Extensions_Selenium2TestCase を見てみましょう。PHPUnit_Extensions_Selenium2TestCase は、次のメソッドを定義します。

public static function suite($className)
{   
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

このメソッドは、$browsers 配列で指定したすべてのブラウザーでテスト スイートをセットアップするために呼び出されます。そのため、抽象テスト クラスでこのメソッドをオーバーライドする必要があります。

public static function suite($className)
{   
    self::browserSetup();
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

ここで、テストしたいブラウザーで環境変数 BROWSER を定義すると、テスト スイートを開始でき、$browsers 配列は、BROWSER 環境変数で定義された単一のブラウザーに指定した設定で適切にオーバーライドされます。Build->Execute shellセクションでjenkinsがこの環境変数を適切に設定していることを確認してください。

4

1 に答える 1

4

@postsコントローラーで 2 回宣言しています。次のようなことを試してください:

if params[:tag]
  @posts = Post.tagged_with(params[:tag]).order("title").page(params[:page]).per(3)
else
  @posts = Post.order("title").page(params[:page]).per(3)
end

@posts = Post.order("title").page(params[:page]).per(3)トップラインを削除した後。

于 2013-07-30T00:33:13.787 に答える