rspec测试失败 - methods.include?

时间:2016-11-13 20:21:17

标签: ruby rspec

我在rspec中不断收到此验证错误。有人可以告诉我我做错了吗?

  1) MyServer uses module
 Failure/Error: expect(MyClient.methods.include?(:connect)).to be true

   expected true
        got false
 # ./spec/myclient_spec.rb:13:in `block (2 levels) in <top (required)>'

这是我的client.rb

#!/bin/ruby
require 'socket'

# Simple reuseable socket client

module SocketClient

  def connect(host, port)
    sock = TCPSocket.new(host, port)
    begin
      result = yield sock
    ensure
      sock.close
    end
    result
  rescue Errno::ECONNREFUSED
  end
end

# Should be able to connect to MyServer
class MyClient
  include SocketClient
end

这是我的spec.rb

describe 'My server' do

  subject { MyClient.new('localhost', port) }
  let(:port) { 1096 }

  it 'uses module' do
    expect(MyClient.const_defined?(:SocketClient)).to be true
    expect(MyClient.methods.include?(:connect)).to be true
  end

我在模块connect中定义了方法SocketClient。我不明白为什么测试会失败。

1 个答案:

答案 0 :(得分:0)

MyClient 没有名为connect的方法。试一试:MyClient.connect无效。

如果要检查类为其实例定义的方法,请使用instance_methodsMyClient.instance_methods.include?(:connect)为true。 methods列出了对象本身响应的方法,因此MyClient.new(*args).methods.include?(:connect)将为真。

但是,实际上,为了检查类上是否存在特定的实例方法,您应该使用method_defined?,并且为了检查对象本身是否响应特定方法,您应该使用respond_to?

MyClient.method_defined?(:connect)
MyClient.new(*args).respond_to?(:connect)

如果您真的 希望MyClient.connect能够直接使用,则需要使用Object#extend而不是Module#include(请参阅What is the difference between include and extend in Ruby?