如何在rspec中验证渲染模板的本地化

时间:2012-01-12 23:27:12

标签: ruby-on-rails rspec rspec-rails

我想知道如何验证传递给控制器​​

中的渲染模板的局部变量

控制器:

def lelf_panel
  # ...
  if some_condition
    locals_hash = some_very_long_hash_A
  else
    locals_hash = some_very_long_hash_B
  end
  render :partial => "left_panel", :layout => false, :locals => locals_hash
end

当前规范:

it 'should render correct template for lelf_panel' do
  # ... 
  get 'left_panel'
  response.should render_template('system/_left_panel')
end   

现在我需要为这个控制器完成Rcov,所以我需要添加/修改规范以涵盖'some_condition'结果。我想验证传递给渲染的'lelf_panel'本地,好像我只验证了render_template,为两个结果渲染的部分页面是相同的。

我检查了rspec docs中的'render_template' http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template

它只提供消息的第二个参数,所以如何测试传递给渲染的本地?

3 个答案:

答案 0 :(得分:16)

您可以在控制器对象上使用期望值,而不是使用render_template匹配器。

it 'should render correct template for lefl_panel' do
  # ...
  allow(controller).to receive(:render).with no_args
  expect(controller).to receive(:render).with({
    :partial => 'system/_left_panel',
    :layout  => false,
    :locals  => some_very_long_hash_A
  })
  get 'left_panel'
end

答案 1 :(得分:3)

@ ryan-ahearn的答案与来自@ user2490003评论的建议相同 - 但所有内容都更灵活,适用于RSpec 3。

<?php
  include_once  './connect_db.php';
 $db= new DBConnect();
  $response=array();
    $title=$_POST["title"];
    $description =$_POST["description"];
    $image =$_POST["image"];
    $username=$_POST["username"];
 //get image id
    $sql ="SELECT id FROM story ORDER BY id ASC";
    $sql1="SELECT id,name FROM account WHERE username='$username'";

    $res = mysqli_query($db->conn,$sql);
    $user=mysqli_query($db->conn,$sql1);
    while($rows =mysqli_fetch_array($user)){
   $user_id=$rows[0];
   $name =$rows["name"];
    }
while($row = mysqli_fetch_array($res)){
$id = $row['id']+1;
 }
 if($id==null)
 {
  $id=1;
  }
 $path = "image_of_child/$id.png";

 $actualpath = "http://www.achieversnepal.com/savechild/$path";

   // mysql query
    $sql = "INSERT INTO story(name,title,description,image) VALUES('$name','$title','$description','$actualpath')";
     if(mysqli_query($db->conn,$sql)){
          file_put_contents($path,base64_decode($image));
          if(mysqli_query($db->conn,"INSERT INTO user_story(story_id,user_id) VALUES($id,$user_id)"))
          {

          }
          $response["success"]=1;
          $response["message"]="Story uploaded successfully!!!";
          die(json_encode($response));
        }
     else{
         $response["success"]=0;
          $response["message"]="Error during upload!!";
          die(json_encode($response));
          }

答案 2 :(得分:1)

据我所知,没有办法以你描述的方式直接检查模板的本地人。

您可以将locals_hash更改为@locals_hash,然后通过分配(:locals_hash)检查结果。

或者,您可以在生成的HTML上使用选择器并检查是否存在某些指示性内容 - 例如,如果locals_hash影响页面标题,请检查生成的HTML页面标题是否符合您的预期。