测试rspec中的方法参数

时间:2013-11-30 16:51:17

标签: ruby rspec

我想知道如何在rspec中使用参数测试方法。在阅读了SO和谷歌上的一些帖子后,我很快意识到should_recieve可以做到这一点。出于一些奇怪的原因,虽然它似乎没有按预期工作。我有可能错过任何东西。

ruby​​代码

def new app_name
end

spec.rb文件

describe BackboneGenerator::CLI do

    before  do
        @cli = BackboneGenerator::CLI.new
    end

    subject { @cli }

       it { should_receive(:new).with(:app_name) }

错误

Failure/Error: it { should_receive(:new).with(:app_name) }
       (#<RSpec::Core::ExampleGroup::Nested_2:0x007fe8b3c5a690>).new(:app_name)
           expected: 1 time with arguments: (:app_name)
           received: 0 times with arguments: (:app_name)

PS:我非常环保测试

1 个答案:

答案 0 :(得分:2)

匹配器should_receive并不能完全按照您的想法行事。它不用于为正在测试的方法断言参数。相反,它用于断言您在测试中执行的操作会导致特定调用间接发生 - 通常是单元测试之外的类或方法。例如,您可能希望声明对IO方法的昂贵调用仅被调用一次,或者它肯定使用您在类的构造函数中设置的相同文件名。

测试接受某些参数的方法通常是在测试中使用这些参数调用您的方法,并对结果进行断言。

describe BackboneGenerator::CLI do

  before  do
    @cli = BackboneGenerator::CLI.new
  end

 subject { @cli }

 describe "#new" do

   it "should accept ( :app_name ) as a parameter" do
     expect { subject.new( :app_name ) }.to_not raise_error
     # Or, more usually:
     # result = subject.new( :app_name )
     # result.should *match_some_test_criteria*
   end

   it "should not accept ( :foo, :bar ) as parameters" do
     expect { subject.new( :foo, :bar ) }.to raise_error
   end

我认为这不是您正在寻找的具体测试,但希望它能为您提供测试代码模式,以便为您的实际测试奠定基础。