Защо не мога да извикам статична функция в моя клас Rspec

Аз съм нов в релсите и току-що започнах да пиша тестове, използвайки 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.


person Egalitarian    schedule 03.01.2013    source източник


Отговори (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

Тази спецификация трябва да премине.

person Erez Rabih    schedule 03.01.2013