【问题标题】:Rspec-Rails: Testing a method with a lot of combinations of argumentsRspec-Rails:使用大量参数组合测试方法
【发布时间】:2012-12-05 16:57:51
【问题描述】:

我有一个方法,如果它做正确的事情,我想测试不同的参数。 我现在正在做的是

    def test_method_with(arg1, arg2, match)
        it "method should #{match.inspect} when arg2 = '#{arg2}'" do
                method(arg1, FIXEDARG, arg2).should == match
        end
    end
    context "method with no info in arg1" do
        before (:each) do
            @ex_string = "no info"
        end
        test_method_with(@ex_string, "foo").should == "res1"}
        test_method_with(@ex_string, "bar").should == "res1"}
        test_method_with(@ex_string, "foobar").should == "res1"}
        test_method_with(@ex_string, "foobar2").should == "res2"}
        test_method_with(@ex_string, "barbar").should == "res2"}
        test_method_with(@ex_string, nil).should == nil}
    end

但是,一遍又一遍地重复这个方法真的不是那么干......有什么更好的方法来完成这个?更多的是 cucumber 的“table”选项的作用(它只是帮助方法的正确行为,所以使用 cucumber 似乎不正确)。

【问题讨论】:

    标签: ruby-on-rails rspec tdd


    【解决方案1】:

    您的方法需要 3 个参数,但您传递了两个参数。 话虽如此,您可以编写一个循环来多次调用it,如下所示:

    #don't know what arg2 really is, so I'm keeping that name
    [ {arg2: 'foo', expected: 'res1'},
      {arg2: 'bar', expected: 'res1'},
      #remaining scenarios not shown here
    ].each do |example|
      it "matches when passed some fixed arg and #{example[:arg2]}" do
         method(@ex_string, SOME_CONSTANT_I_GUESS,example[:arg2]).should == example[:expected]
      end
    end
    

    这样,您只有一个示例(又名it 调用),并且您的示例被提取到数据表(包含哈希的数组)中。

    【讨论】:

      【解决方案2】:

      如果您删除实例变量@ex_string 的传递,我认为您的方法很好。 (正如 Kenrick 建议的那样,匹配只发生在 test_method_with 中。)也就是说你可以使用自定义匹配器:

      RSpec::Matchers.define :match_with_method do |arg2, expected|
        match do
          method(subject, arg2) == expected
        end
      
        failure_message_for_should do
          "call to method with #{arg2} does not match #{expected}"
        end
      end
      
      it 'should match method' do
        "no info".should match_with_method "foo", "res1"
      end
      

      匹配器可以放在规范帮助文件中,以便从多个规范中访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        相关资源
        最近更新 更多