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)
我做错了什么?
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)