【问题标题】:rspec assigns converts hash keys to stringrspec assigns 将哈希键转换为字符串
【发布时间】:2013-06-27 20:43:46
【问题描述】:

我有一个控制器操作,我将哈希分配给实例变量。在我的 rspec 测试文件中,我使用 assigns 来测试它,实例变量被分配给我期望的值。出于某种原因,assigns 给了我一个带有字符串键的散列。如果我在控制器中打印实例变量,我有符号键

请在下面找到代码。它被简化了。

class TestController < ApplicationController
  def test
    @test_object = {:id => 1, :value => 2, :name => "name"}
  end
end

我的测试文件:

describe TestController do
  it "should assign test_object" do
    get :test
    assigns(:test_object).should == {:id => 1, :value => 2, :name => "name"}
  end
end

上述测试失败并显示错误消息

expected: {:id=>1, :value=>2, :name=>"name"}
     got: {"id"=>1, "value"=>2, "name"=>"name"}

请帮助我理解为什么会这样。

【问题讨论】:

标签: ruby-on-rails hash rspec


【解决方案1】:

RSpec 从常规的 Rails 测试/单元助手中借用赋值,并使用 with_indiffer_access 返回请求的实例变量,如assigns(:my_var)

Hash#with_indifferent_access 返回哈希的键字符串化版本(深层副本),其副作用是对作为哈希的实例变量的键进行字符串化。

如果您尝试匹配整个哈希,它将失败,但如果您正在检查特定键的值,无论它们是符号还是字符串,它都会起作用。

也许一个例子可以帮助澄清:

{:a => {:b => "bravo"}}.with_indifferent_access => {"a"=>{"b"=>"bravo"}} 
{:a => {:b => "bravo"}}.with_indifferent_access[:a][:b] => "bravo"

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2015-08-24
    • 2012-12-12
    • 2019-08-26
    相关资源
    最近更新 更多