1

私はrspecが初めてで、特定のテストの書き方を理解しようとしています。

バックグラウンド:

  • Sinatra アプリをテストしています
  • そのアプリは複数のデータベースに接続します
  • これらのデータベースのユーザー名/パスワードを環境変数として定義し、これらの変数をコードで参照しています。

私は動作テストを行っているので、環境変数の存在をテストする方法を知っています。

これが私がそれをした方法です:

27     it "should know the username for each SUBDOMAIN in the list" do
28       @dm.domains.each do |dom|
29         ENV['C_USERNAME_' + dom].nil?.should eq(false)
30       end
31     end

私が言ったように、テストは機能します。唯一の問題は、失敗したときに、環境変数が設定されていない dom が不明であることです。失敗したテストの結果は次のようになります。

    dhaskew@Air1:~/code/projects/rules$ rake spec
   /Users/dhaskew/.rvm/rubies/ruby-1.9.3-p194/bin/ruby -S rspec ./spec/c_spec.rb   ./spec/main_spec.rb ./spec/routes_spec.rb
   ..F*.....*

    Pending:
      My Site Domain Manager should know the password for each SUBDOMAIN in the list
      # Not yet implemented
      # ./spec/c_spec.rb:33
      My Site GET '/rules/SUBDOMAINS' should test all subdomains
      # Not yet implemented
      # ./spec/routes_spec.rb:28

   Failures:

     1) My Site Domain Manager should know the username for each SUBDOMAIN in the list
        Failure/Error: ENV['C_USERNAME_' + dom].nil?.should eq(false)

          expected: false
          got: true

          (compared using ==)
         # ./spec/c_spec.rb:29:in `block (4 levels) in <top (required)>'
         # ./spec/c_spec.rb:28:in `each'
         # ./spec/c_spec.rb:28:in `block (3 levels) in <top (required)>'

     Finished in 0.05095 seconds
     10 examples, 1 failure, 2 pending

    Failed examples:

    rspec ./spec/c_spec.rb:27 # My Site Domain Manager should know the username for each SUBDOMAIN in the list
    rake aborted!

質問: どの環境変数が定義されていないかを確認できるように、このテストをより適切に作成するにはどうすればよいですか。

ありがとう。

4

1 に答える 1

0

1 つの簡単な解決策は次のとおりitです。テストを動的に生成します。it一般に、シナリオ/ブロックごとに 1 つのテストを目指します。この場合:

@dm.domains.each do |dom|
  it "should know the username for #{dom} in the list" do
    ENV['C_USERNAME_' + dom].should_not be_nil
  end
end

アップデート

より完全な例を次に示します。@dmブロックを使用可能にするには、ブロックの外側で宣言する必要beforeがあります。

class DomainManager
  attr_reader :domains

  def initialize(domains)
    @domains = domains
  end
end

describe DomainManager do
  @dm = DomainManager.new( %w(example.com example.org))

  @dm.domains.each do |dom|
    it "should know the username for #{dom} in the list" do
      ENV['C_USERNAME_' + dom].should_not be_nil
    end
  end
end
于 2012-09-08T00:30:06.010 に答える