Używam wstawek raw/bare-metal sql, aby zwiększyć wydajność zapisu w mojej usłudze. Mam coś takiego w moim module -Rspec: Testowanie ActiveRecord :: Base.connection.execute
insert = "('#{id}', '#{status}', '#{some_time_val}')"
sql_string = "INSERT INTO history ('device_id', 'status', 'time') VALUES #{insert}"
ActiveRecord::Base.connection.execute sql_string
Kiedy piszę rspec jak poniżej, to sprawdza wszystko z wyjątkiem tego, czy wkładka przeszedł. Tak więc moje oczekiwania nigdy nie zadziałają ze względu na sposób, w jaki rspec, database_cleaner itd. Wycofują transakcje i transakcje. Próbowałem za pomocą
self.use_transactional_fixtures = false
i
before(:all) do
DatabaseCleaner.strategy = nil
end
ale wkładki nadal nie przejść do mojej bazy testowej
describe Worker do
let (:device1) {FactoryGirl.create(:device)}
let (:device2) {FactoryGirl.create(:device)}
let (:device3) {FactoryGirl.create(:device)}
self.use_transactional_fixtures = false
before(:all) do
DatabaseCleaner.strategy = nil
end
it "does something" do
devices = [{"status" => "Offline", "time" => "2013-09-17 18:17:17", "id" => device1.id},
{"status" => "Online", "time" => "2013-09-17 18:18:18", "id" => device2.id}]
Worker.any_instance.stubs(:devices).returns(devices) ## Not important for this question
Worker.new.perform
device1.reload.status.should == "Offline" # FAILS
end
end
Jak bym to sprawdzić? Jaka jest dobra strategia testowania surowych wstawek sql w ten sposób?
Zdecydowanie nie chcesz czyszczenia bazy danych. Przynajmniej chcesz przyciąć. Brak czyszczenia oznacza zanieczyszczenie testowe.Zauważ również, że twoje zapytanie ma lukę w SQL injection. –
Nie mogę wymyślić powodu, dla którego nie byłbyś w stanie przetestować tego "normalnie" (i myślę, że czyszczenie bazy danych jest czerwonym śledziem). Wykonaj testy, jeśli użyjesz normalnego aktywnego rekordu zamiast "wykonaj" (wydaje mi się ciekawe, że przeładowujesz istniejący obiekt, aby przetestować jego status, podczas gdy opublikowany fragment wydaje się wstawiać nowy wiersz do innej tabeli) –
Co jest wyjściem po uruchomieniu zapytania w konsoli piaskownicy? Wydaje mi się, że w zapytaniu brakuje ostatecznego ";". – cenouro