0

私はRailsを初めて使用し、rspecバージョン2.11.1を使用してテストを書き始めたところです。クラスのさまざまなテストにさまざまなデータをシードする方法を探しています。このために、テスト自体に静的関数を作成しました。要件に応じて、さまざまな数のオブジェクトをインスタンス化しています。渡された数に基づいて異なる数のオブジェクトをインスタンス化する関数seed_dataがあります。この例外が発生します:

NoMethodError: undefined method `seed_data' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_5::Nested_1:0x007fcedd9bea70>

以下のサンプルコードをご覧ください。

require 'spec_helper'
require 'go_live_sale'
require 'rspec/expectations'

describe GoLiveSale do


  context "get_go_live_sale_for_sale_ids Function Correctness" do

    describe "Testing get_go_live_sale_for_sale_ids() function correctness " do
      it "should return error when sale_ids is blank" do
         result = GoLiveSale.get_go_live_sale_for_sale_ids({})
         result[:err].should_not be_blank
         result[:err].should  == "err1"
      end

      it "should return all columns corresponding to select field for single go_live_sale" do
        go_live_sales = seed_data(1)
        sale_ids =  go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
        result = GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids})
        result[:err].should be_blank
        result[:go_live_sales].count.should_be == 1
        delete_seed_data(go_live_sales)
      end

      it "should return all columns corresponding to select field for multiple go_live_sale" do
        go_live_sales = seed_data(2)
        sale_ids =  go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
        GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids})
        result[:err].should be_blank
        result[:message].should be_blank
        result[:go_live_sales].count.should == 2
        delete_seed_data(go_live_sales)
      end

      it "should return selected columns corresponding to select field for single go_live_sale" do
        go_live_sales = seed_data(1)
        sale_ids =  go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
        result = GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids, :columns => ["id","sale_id"]})
        result[:err].should be_blank
        result[:go_live_sales].count.should_be == 1
        delete_seed_data(go_live_sales)
      end

      it "should return selected columns corresponding to select field for multiple go_live_sale" do
        go_live_sales = seed_data(2)
        sale_ids =  go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
        GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids,  :columns => ["id","sale_id"]})
        result[:err].should be_blank
        result[:message].should be_blank
        result[:go_live_sales].count.should == 2
        delete_seed_data(go_live_sales)
      end

      it "should return error when selecting erroneous columns" do
        go_live_sales = seed_data(2)
        sale_ids =  go_live_sales.map{ |go_live_sale| go_live_sale.sale_id}
        GoLiveSale.get_go_live_sale_for_sale_ids({:sale_ids => sale_ids,  :columns => ["id","random_sale_id"]})
        result[:err].should_not be_blank
        delete_seed_data(go_live_sales)
      end

    end
  end
end

def self.delete_seed_data(go_live_sales)
  go_live_sales.each do |go_live_sale|
    go_live_sale.delete
  end
end

def self.seed_data(number_of_go_live_sale_to_create)
  go_live_sales =[]
  (1..number_of_go_live_sale_to_create).each do |number|
    go_live_sales.push(create_go_live_sale(number))
  end
  return go_live_sales
end

def self.create_go_live_sale(number_to_add)
  go_live_sale  =  GoLiveSale.new
  go_live_sale.start_date = Time.now
  go_live_sale.sale_id = Sale.select("IFNULL(max(id),0)+#{number_to_add} as sale_id").first.try(:sale_id)
  go_live_sale.sale_name = "Test Sale" + go_live_sale.sale_id.to_s
  go_live_sale.sale_type = "Flash Sale"+ go_live_sale.sale_id.to_s
  User.current_user = User.first
  go_live_sale.save
  return go_live_sale
end

RSpec::Matchers.define :be_valid do
  match_for_should do |actual|
    actual[:err].blank?
    actual[:validation_error].blank?
    actual[:is_valid] == true
  end

  match_for_should_not do |actual|
    actual[:err].present?
    actual[:validation_error].present?
    actual[:is_valid] == false
  end

  failure_message_for_should do |actual|
    "Expected validation to pass, but it failed"
  end

  failure_message_for_should_not do |actual|
    "Expected validation to fail, but it passed"
  end
end

スコープの問題であるか、rspecでテストをそのように記述できない可能性があることを理解しています。そのような場合にテストデータをインスタンス化する方法を説明するコードの小さなスニペットを誰かが書くことができれば素晴らしいでしょう。私のrailsバージョンは3.0.5です。

4

1 に答える 1

1

self.メソッド定義でを取り除き、describe GoLiveSale doブロック内に移動してからseed_data、期待どおりに呼び出すことができます。

例えば:

describe GoLiveSale do
  def my_method
  end
  context "some context" do
    it "should call my_method" do
      expect {my_method}.not_to raise_error
    end
  end
end

この仕様は合格するはずです。

于 2013-01-03T13:42:46.787 に答える