Спецификация для создания файла и записи в файл - PullRequest
0 голосов
/ 21 февраля 2012

Я новичок здесь. Я работаю над проектом с некоторыми тестами. У меня есть некоторые проблемы с написанием спецификации для класса. Я закончил с некоторыми простыми спецификациями, но понятия не имею, как написать для этого. Любая помощь будет высоко оценена.

Мой класс

Class Writer

def initialize(filepath)
  @filepath = RAILS_ROOT + filepath
  @xml_document = Nokogiri::XML::Document.new
end

def open
  File.open(@filepath,"w") do |f|
    @gz = Zlib::GzipWriter.new(f)
    @gz.write(%[<?xml version="1.0" encoding="UTF-8"?>\n])
    @gz.write(%[<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n])
    yield self
    @gz.write(%[</urlset>])
    @gz.close
  end
end

def write_entry_to_xml(entry)
   node = Nokogiri::XML::Node.new( "url" , @xml_document )
   node["loc"] = entry.loc
   node["changefreq"] = entry.changfreq
   node["priority"] = entry.priority
   node["lastmod"] = entry.lastmod
   @gz.write(node.to_xml)
end

end

На данный момент я написал следующее:

describe "writer" do 
 before :each do 
  @time = Time.now
  @filepath = RAILS_ROOT + "/public/sitemap/test/sitemap_test.xml.gz"
  File.open(@filepath,"w") do |f|
   @gz = Zlib::GzipWriter.new(f)
  end
  @xml_document = Nokogiri::XML::Document.new
  @entry = Sitemap::Entry.new("location", "monthly", "0.8", @time)
end 

describe "open" do 
 it "should create a file and write xml entries to it" do 
 end
end

describe "write_entry_to_xml" do 
 it "should format and entry to xml node and write it" do 
  node = Nokogiri::XML::Node.new( "url" , @xml_document )
  node["loc"].should == @entry.loc
  node["changefreq"].should == @entry.changfreq
  node["priority"].should == @entry.priority
  node["lastmod"].shoul == @entry.lastmod
end

конец

Может кто-нибудь помочь мне в написании полной спецификации для этого класса. Заранее спасибо

1 Ответ

1 голос
/ 22 февраля 2012

У меня нет времени, чтобы сделать все это для вас, но вот примеры того, как я тестирую свой код:

Обратите внимание: Ropet::Config.expects(:new).returns(config), это можно использовать для Nokogiri::XML::Node#new.

В моих спецификациях используются RSpec и Mocha, мне нравится простота этой настройки и то, что можно сделать с помощью этих простых инструментов.

Редактировать: грубая спецификация для

def write_entry_to_xml(entry)
   node = Nokogiri::XML::Node.new( "url" , @xml_document )
   node["loc"] = entry.loc
   node["changefreq"] = entry.changfreq
   node["priority"] = entry.priority
   node["lastmod"] = entry.lastmod
   @gz.write(node.to_xml)
end

Это может быть что-то вроде этого, хотя я не знаю цели вашего кода.

it 'writes entry to xml' do
    content = double('output')
    node = double('node'); node.should_receive(:to_xml).and_return(content);
    gz = double('gz'); gz.should_receive(:write).with(content)
    w = Writer.new("some_path"); w.open
    w.instance_variable_set(:@gz, gz) # i'm guessing @gz is assigned after open only?
    entry = # i don't know what entry is
    Nokogiri::XML::Node.stub(:new).and_return(node)
    node.should_receive(:[]).with("loc", entry.loc)
    node.should_receive(:[]).with("changefreq", entry.changefreq)
    node.should_receive(:[]).with("priority", entry.priority)
    node.should_receive(:[]).with("lastmod", entry.lastmod)
    w.write_entry_to_xml(entry)
end
...