Non persistent model a testy

Mam model, którego zadaniem jest pobieranie danych korzystając z SOAPa. Sparsowanych danych nigdzie nie zapisuję permanentnie (pliki/baza). Próbowałem napisać do tego unit testy (które mają być odpalane przez rake), ale nie wiem, jak to zrobić kiedy nie korzystam w modelu z bazy danych. Czy w ogóle unit testy są odpowiednie do tego zadania ? Jeśli tak, to jak je napisać, odpalać ?

Dzięki z góry za odpowiedzi.

Ja muszę lecieć na autobus, więc się nie rozpiszę, ale być może potrzebujesz gema FakeWeb - (ścieżkę na pewno zna google).

Nie ważne, czy korzystasz z bazy czy nie. Masz model? Masz. Model ma metody? Ma. No to możesz te metody testować w unit testach. Na wejściu dajesz modelowi “coś”, on ma zwrócić “inne coś”. I to właśnie testujesz. Dobra lecę…

I to właśnie próbuję zrobić, z tym że rake test:units cąły czas domaga się a to migracji, a to schema bazy…

Zamiast FakeWeb korzystam (próbuję korzystac) http://rubygems.org/gems/savon_spec - bardziej odpowiednie do zadania.

Prosi dlatego, że model zapewne dziedziczy u ciebie po ActiveRecord::Base

Również nie mam w tej chwili czasu wchodzenia w szczegóły, ale popatrz sobie na przykład modelu bez wykorzystania bazy danych.

CloudApp — Not Found

Model nie dziedziczy po niczym. Wiem, że zielona szkoła - ale bez przesady :slight_smile:

okej, nie dziedziczy to może dołączasz jakiś moduł? a może źle wywołujesz testy? a może to, a może tamto : ] come on, pokaż jakiś kod, bo tak to możemy zgadywać do usranej śmierci.

Naprawde nic specjalnego:

gemfile

[code]source ‘https://rubygems.org

gem ‘rails’, ‘3.2.1’
gem ‘savon’

assety itd.[/code]

weather.rb

class Weather def find_weather_info(zip_code) client = Savon.client("url do wsdl") response = client.request :get_weather_by_zip_code data = response.to_array(:get_weather_by_zip_code_response, :get_get_weather_by_zip_code_result) end end
unit/weather_test.rb

[code]# probowalem tez < Test::Unit::TestCase i zmiane na test => def
class WeatherTest < ActiveSupport::TestCase
def setup
@weather = Weather.new
end

test “check sample zip code matches” do
info = @weather.find_weather_info(“00000”)
assert_equal info[:temperature], “20”
assert_equal info[:sun], “full”
end
end[/code]

a co ci wyrzuca rake test? na 100% nie masz innych modeli do których nie masz migracji albo nie wywołałeś db:migrate?

Jeżeli nie masz żadnych modeli, które korzystają z bazy, to powinieneś w application.rb zamiast:

require 'rails/all'

dać:

require 'action_controller/railtie' require 'action_mailer/railtie' require 'sprockets/railtie' require 'rails/test_unit/railtie'
Możesz to zrobić też przy tworzeniu aplikacji podając argumen -O (alias do --skip-active-record)

rails new foo -O

Jeżeli jednak masz jakieś modele, które korzystają z bazy danych, to musisz utworzyć bazę danych i zrobić dla nich migracje - railsy otwierają kilka połączeń do bazy danych podczas startowania aplikacji, więc nawet jak akurat nie używasz innych modeli w danym teście, to musisz mieć odpowiedni setup.