4

如果未提供参数,如何测试采用参数的方法是否使用默认值?

例子

# this method shouldn't error out
# if `Post.page_results` without a parameter
class Post
  def self.page_results(page=1)
    page_size = 10
    start = (page - 1) * page_size
    finish = start + page_size
    return Page.all[start..finish]
  end
end

如何签入page等于1ifpage_results没有参数调用的 rspec?

4

3 回答 3

3

测试page参数是否设置了默认值,很可能不是您应该测试的。在大多数情况下,最好测试行为而不是实现(Sandy Metz 关于测试的谈话)。在您的情况下,您应该测试是否返回了预期的集合Pages,何时page_results在没有参数的情况下调用(默认情况)。

这是一个如何执行此操作的示例:

describe Post do
  describe ".page_results" do
    context "when Pages exist" do
      subject(:pages) { described_class.page_results(page) }

      let(:expected_pages_default) { expected_pages_page_1 }
      let(:expected_pages_page_1)  { Page.all[0..10] }
      let(:expected_pages_page_2)  { Page.all[10..20] }

      before do
        # Create Pages
      end

      context "when no page param is give " do
        # HINT: You need to redefine subject in this case. Setting page to nil would be wrong
        subject(:pages) { described_class.page_results }

        it { expect(pages).to eq expected_pages_default }
      end

      context "when the page param is 1" do
        let(:page) { 1 }

        it { expect(pages).to eq expected_pages_page_1 }
      end

      context "when the page param is 2" do
        let(:page) { 2 }

        it { expect(pages).to eq expected_pages_page_2 }
      end
    end

    context "when no Pages exist" do
      # ...
    end
  end
end
于 2019-04-19T19:59:24.997 回答
-1
describe Post do
  describe '#page_results' do
    let(:post) { create :post }

    context 'without arguments' do
      it { post.page_results.should eq 1 }
    end
  end
end

create :post声明是您将如何使用FactoryGirl。但是您当然可以模拟或删除您的模型。

更新

describe Post do
  describe '#page_results' do

    context 'without arguments' do
      it { Post.page_results.should eq 1 }
    end

    context 'with arguments' do
      it { Post.page_results('foo').should eq 'bar' }
    end
  end
end
于 2013-05-31T08:40:12.033 回答
-1

我使用 before_validation 设置默认值,例如

before_validation do
      self.some_attribute ||=a_default_value
end

这留下了覆盖默认值的可能性

SomeClassWithDefaultAttributes.create(some_attribute:a_non_default_value)

请记住,如果 #before_validation 返回 false,则验证将失败

于 2015-08-18T16:43:50.953 回答