簡體   English   中英

使用存根運行rspec測試時的未定義方法

[英]Undefined Method when running rspec test using a stub

我有一個模型,它有一個to_csv方法和導入方法,試圖在rspec中測試它,以確保它做正確的事情但有問題。 我收到以下錯誤:

Failures:

  1) Category Class import should create a new record if id does not exist
     Failure/Error: Category.import("filename", product)
     NoMethodError:
       undefined method `path' for "filename":String

模型:

class Category
  ...<snip>

  def self.import(file, product)
    product = Product.find(product)
    CSV.foreach(file.path, headers: true, col_sep: ";") do |row|
      row = row.to_hash
      row["variations"] = row["variations"].split(",").map { |s| s.strip }
      category = product.categories.find(row["id"]) || Category.new(row)
      if category.new_record?
        product.categories << category
      else
        category.update_attributes(row)
      end
    end
  end

  def self.to_csv(product, options = {})
    product = Product.find(product)
    CSV.generate(col_sep: ";") do |csv|
      csv << ['id','title','description','variations']
      product.categories.each do |category|
        variations = category.variations.join(',')
        csv << [category.id, category.title, category.description, variations]
      end
    end
  end
end

我的測試:

describe Category do

  describe 'Class' do
    subject { Category }

    it { should respond_to(:import) }
    it { should respond_to(:to_csv) }

    let(:data) { "id;title;description;variations\r1;a title;;abd" }

    describe 'import' do
      it "should create a new record if id does not exist" do
        product = create(:product)
        File.stub(:open).with("filename","rb") { StringIO.new(data) }
        Category.import("filename", product)
      end
    end
  end
end

我只想讓Category.import取一個文件名:

Category.import("filename", product)

然后Category.import只是將此文件名傳遞給CSV.foreach調用:

CSV.foreach(filename, headers: true, col_sep: ";") do |row|

然后沒有必要File.open或任何爵士樂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM