2016-11-13 4 views
0

rspec에서이 유효성 검사 오류가 계속 발생합니다. 누군가 내가 뭘 잘못하고 있는지 말해 줄래? rspec 테스트가 실패했습니다. - methods.include?

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 

입니다 그리고 이것은 내가 모듈 SocketClient에 정의 된 방법 connect을 내 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 

입니다. 나는 왜 시험이 계속 실패하는지 이해하지 못한다.

답변

0

클래스MyClient는 방법은 connect 이름하지 않습니다. 사용해보기 : MyClient.connect가 작동하지 않습니다.

당신이 클래스는 인스턴스에 대한 정의 어떤 방법을 확인 instance_methods을 사용하려면 : MyClient.instance_methods.include?(:connect) 사실 일 것입니다. methods자체 개체이 응답하는 메서드를 나열하므로 MyClient.new(*args).methods.include?(:connect)이 true가됩니다.

정말, 그래도 특정 인스턴스 방법을 사용 method_defined?를 사용해야하는 클래스에 존재하는지 여부를 확인하기 위해, 그리고 개체 자체가 특정 방법에 응답 여부를 확인하기 위해, 당신은 사용해야 respond_to? :

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

정말로 일 경우을 사용하려면 MyClient.connect을 직접 작동 시키려면 Module#include (What is the difference between include and extend in Ruby? 참조) 대신 Object#extend을 사용해야합니다.

관련 문제