2016-11-13 2 views
0

Ich bekomme diesen Validierungsfehler in rspec. Könnte jemand bitte erzählen, was ich falsch mache?rspec test fehlgeschlagen - 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)>' 

Das ist mein 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 

Und das ist mein 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 

I Verfahren haben connect in Modul definiert SocketClient. Ich verstehe nicht, warum der Test versagt.

Antwort

0

Die KlasseMyClientnicht haben ein Verfahren connect benannt. Versuchen Sie es: MyClient.connect wird nicht funktionieren.

Wenn Sie überprüfen möchten, welche Methoden eine Klasse für seine Instanzen definiert verwenden instance_methods: MyClient.instance_methods.include?(:connect) wahr sein wird. methods listet die Methoden ein Objekt selbst reagiert auf, so würde wahr sein.

Wirklich, aber zu prüfen, ob eine spezifische Instanz-Methode für eine Klasse existiert Sie method_defined? verwenden sollten, und zu prüfen, ob ein Objekt sich auf ein spezielles Verfahren reagiert, sollten Sie verwenden respond_to?:

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

Wenn Sie wirklich tun möchten wollen MyClient.connect direkt arbeiten, müssten Sie Object#extend statt Module#include (siehe What is the difference between include and extend in Ruby?) verwenden.