RSpec be_equal无效

ban*_*abr 2 ruby rspec ruby-on-rails

我正在我的rails项目中为一个普通的旧ruby类编写一些rspec示例,我遇到了以下问题.我有这个构造函数:

    class Server
        def initialize(host='localhost',options={:port => 443, :password => '', :vpncmd_bin_path => '/usr/local/bin/vpncmd', :timeout => 5})
            @host = host
            @port = options[:port].present? ? options[:port] : 443
            @password = options[:password].present? ? options[:password] : ''
            @vpncmd_bin_path = options[:vpncmd_bin_path].present? ? options[:vpncmd_bin_path] : '/usr/local/bin/vpncmd'
            @timeout = options[:timeout].present? ? options[:timeout] : 5
            @hubs = {}
            @hub_cache_dirty = true
            @hub_password_cache = {}
        end
        ...
    end
Run Code Online (Sandbox Code Playgroud)

这个测试例子:

  it "should have a default constructor that takes no argument" do
    s = SoftEther::Server.new()
    expect(s.host).to be_equal('localhost')
    expect(s.port).to be_equal('443')
    expect(s.timeout).to be_equal(5)
    expect(s.vpncmd_bin_path).to be_equal('/usr/local/bin/vpncmd')
    expect(s.password).to be_equal('')
  end
Run Code Online (Sandbox Code Playgroud)

并且rspec在Rails 4.2.6,jruby-9.0.5.0和3.4.4中给出了以下结果:

  1) SoftEtherSever should have a default constructor that takes no argument
     Failure/Error: expect(s.host).to be_equal('localhost')
       expected `"localhost".equal?("localhost")` to return true, got false
     # ./spec/poro/softether_spec.rb:19:in `block in (root)'
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Sim*_*tti 6

equal?检查两个实例是否相同.但是当两个字符串包含相同的值但引用不同的对象时,它返回false:

"foo".equals?("foo")
# => false
Run Code Online (Sandbox Code Playgroud)

你应该真正使用的是 eq()

expect(s.host).to eq('localhost')
Run Code Online (Sandbox Code Playgroud)