【问题标题】:How to write a particular rspec test? Advice needed ...如何编写特定的 rspec 测试?需要咨询...
【发布时间】:2012-09-07 21:56:41
【问题描述】:

我是 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!

问题:如何更好地编写此测试,以便我可以看到未定义的环境变量。

谢谢。

【问题讨论】:

    标签: ruby testing rspec sinatra rspec2


    【解决方案1】:

    一个简单的解决方案是:动态生成it 测试。一般来说,每个场景/it 块争取一个测试。在这种情况下:

    @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
    

    更新

    这里有一个更完整的例子。您需要在 before 块之外声明 @dm 才能使用它。

    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
    

    【讨论】:

    • 我最初尝试过,但无法使其正常工作。我收到的基本错误是“nil:NilClass (NoMethodError) 的未定义方法‘域’”,这表明@dm 超出范围?我已经在'12 before(:all) do 13 @dm = C::DomainManager.new 14 end' 顶部的 before 块中定义了它
    • @David:在before 块中定义的变量仅在it 块中可用。但是,RSpec 只是 Ruby 代码,因此您可以在顶部定义实例变量。我用一个例子更新了我的答案。
    • 谢谢,这让我工作。我很可能会使用这种模式。我仍然需要阅读与 rspec 相关的范围界定,但我肯定过度考虑了这种情况。感谢您的简单示例。
    • @David:太好了,很高兴它对你有用。一定要使用上下文、隐式主题等进行检查!以下是一些帮助您入门的链接:rspec-2-best-practices slidesanother best practices 发布。快乐的规范!
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多