2012-02-19 13 views
7

Mam test RSpec dla klasy w /lib/classes, która potrzebuje dostępu do pliku zip (bez przesyłania). Plik jest przechowywany w /spec/fixtures/files/test.zip. Jak wprowadzić prawidłową ścieżkę, tak aby jej środowisko było agnostyczne, tj. Bez bezwzględnej ścieżki?względna ścieżka pliku w RSpec

Odpowiedz

4

Z tego, co wiem (patrząc co miesiąc lub dwa), nie ma lepszego sposobu na budowanie czegoś w spec_helper, które używa wartości __FILE__, aby pobrać ścieżkę do znanego fragmentu treści, a następnie zbudować własne pomocniki na wierzchu tego.

Oczywiście można również użyć ścieżki w stosunku do __FILE__ w indywidualnym pliku *_spec.rb.

+0

Dla innych z tym samym problemem: Ponieważ moja specyfikacja znajduje się w/spec/classes, skończyło się na: 'File.dirname (__ FILE__) + '/../ fixtures/files/test.zip'' – wintersolutions

+0

Działa to dobrze, ale to może być trochę kruchy na wypadek, gdybyś zmienił swoje specyfikacje. Oczywiście nie należy zakładać, że używasz Railsów, ale jeśli masz dostęp do katalogu głównego projektu (Rails.root, Sinatra :: Application.root), może to być - lub nie - być bardziej stabilną alternatywą. – lab419

+0

, aby działało to na różnych platformach, nie umieszczaj w łańcuchu znaków "/", zamiast tego użyj: File.join (File.dirname (__ FILE__), "..", "urządzenia", "pliki", "test". zip ") – Ultrasaurus

13

Rails.root daje root aplikacji, więc

Rails.root.join "spec/fixtures/files/test.zip" 

daje bezwzględną ścieżkę do pliku, agnostycznego od miejsca aplikacji na dysku twardym.

+0

Dzięki rspec-rails można uzyskać dostęp do urządzeń łatwiejszych, jak opisano tutaj: https://www.relishapp.com/rspec/rspec-rails/v/3-5/docs/file-fixture – thisismydesign

1

mam rozwiązać ten problem niedawno i oto co wymyśliłem:

Definiowanie stałym Twój spec_helper.rb (lub odpowiednik), wskazując na RSpec root:

RSPEC_ROOT = File.dirname __FILE__ 

użyć tej zmiennej w swojej *_spec.rb (lub odpowiednik) pliki testowe:

require 'spec_helper' 

File.open("#{RSPEC_ROOT}/resources/example_data.json") 

Dlaczego to rozwiązanie?

  • To nie skorzystać z lokalizacji pliku testowego, który może być ulec zmianie (spec_helper prawdopodobnie nie)
  • To nie wymaga żadnych uzupełnień do testowania pliki inne niż już istniejące require 'spec_helper'
  • To nie zależy on Rails (w przeciwieństwie Rails.root)

Oto Streszczenie: https://gist.github.com/thisismydesign/9dc142f89b82a07e413a45a5d2983b07

Powiązane problemy