2016-12-15 6 views
1

私はclientオブジェクトをWebサービスで動作させる必要のあるルビーの宝石に収めています。私はそれが適切に初期化し、すべての引数が渡されていない場合は、エラーをスローできることを確認するためにテストしていRspec:通過テストを失敗させるにはどうしたらいいですか?

ここに私の仕様です:。

module Contentstack 

    class Client 
    attr_reader :access_key, :access_token, :environment 

    def initialize(access_key:, access_token:, environment:) 
     @access_key = access_key 
     @access_token = access_token 
     @environment = environment 

     validate_configuration! 
    end 

    def validate_configuration! 
     fail(ArgumentError, "You must specify an access_key") if access_key.nil? 
     fail(ArgumentError, "You must specify an access_token") if access_token.nil? 
     fail(ArgumentError, "You must specify an environment") if environment.nil? 
    end 
    end 

end 
:ここ

describe 'Contentstack::Client Configuration' do 
    describe ":access_token" do 
    it "is required" do 
     expect { create_client(access_token: nil) }.to raise_error(ArgumentError) 
    end 
    end 

    describe ":access_key" do 
    it "is required" do 
     expect { create_client(access_key: nil) }.to raise_error(ArgumentError) 
    end 
    end 

    describe ":environment" do 
    it "is required" do 
     expect { create_client(environment: nil) }.to raise_error(ArgumentError) 
    end 
    end 
end 

は、宝石のコードです

、ここではspec_helper方法である:

def create_client(access_token:, access_key:, environment:) 
    Contentstack::Client.new(access_token: access_token, access_key: access_key, environment: environment) 
end 

問題がある:私はTHESを作るための方法を見つけることができませんテストが合格する前に失敗します。ルビはデフォルトでArgumentErrorを投げるので、これらのテストは常に失敗します。これがTDDの正しいアプローチであるかどうかは分かりません。このシナリオでは、どのようにして赤と緑のリファクタリングサイクルに入るのですか?

答えて

3

create_clientArgumentError上げ、それが3つのキーワード引数を期待して、あなたが渡しているので、一つだけ:

def create_client(access_token: :foo, access_key: :bar, environment: :baz) 
    Contentstack::Client.new(access_token: access_token, access_key: access_key, environment: environment) 
end 

create_client(access_key: nil) 
# in `validate_configuration!': You must specify an access_key (ArgumentError) 
:(多分あなたも、あなたのヘルパーをテストしている必要があります)

def create_client(access_token:, access_key:, environment:) 
    # intentionally left empty 
end 

create_client(access_key: nil) 
# in `create_client': missing keywords: access_token, environment (ArgumentError) 

あなたはこれを克服するために、あなたのヘルパーのデフォルト値を使用することができます

最後に、あなたは、エラーメッセージに関するより具体的な可能性:正確に行うモジュールを付加ん何

expect { ... }.to raise_error(ArgumentError, 'You must specify an access_key') 
+0

ああ、確かに、今私の答えをアップアップした2人の人は誰だろうと思う。ところで、これは回避すべき_実装例test_の完璧な例です。 – mudasobwa

+0

ねえ、これは動作します。しかし、私は間違いを理解していません。私のヘルパーのバグですか? –

+0

@AmitErandole空のヘルパーで私の最初の例を見てください。すべての必須のキーワード引数を渡していないので、 'ArgumentError'が発生します。 – Stefan

1

はステファンして、回答を参照してください、それは適切な方法は、何もしないようにClient#validate_configuration!を嘲笑するが、ここではさらに簡単かもしれないだろう

方法がより適切です。あなたのtest_helper.rbに入れる:

Client.prepend(Module.new do 
    def validate_configuration!; end 
end) 

を率直に言って、私は彼らがこの特定のケースで渡す前に、失敗するテストを強制する理由が表示されません。 TDDに従うには、の前にvalidate_configuration!の実装を実行していたはずです。その後、これらのテストは失敗しました。あなたは事前にそれを実装しているので、

はしかし、ルール盲目的に軽率フォローする必要はありません「テストがパスの前に失敗する必要があります。」

+0

?それは失敗するでしょうか? –

+0

http://ruby-doc.org/core-2.3.2/Module.html#method-i-prepend – mudasobwa

+0

この例の後にモジュールをどのようにアンプリペンドしますか? – Stefan

関連する問題