[英]Factory not defined for RSPEC test Ruby
我正在嘗試為此服務編寫RSpec
測試。 下面的服務本質上只是調用某個端點,然后在postgres
數據庫中創建數據。
class SomeService
API_URL = "someEndPoint"
def process
get_reviews
end
def get_reviews
conn = Faraday.new(url: "#{APIURL}/#{ENV["ID"]}/reviews?language=en&stars=5") do |faraday|
faraday.headers["apikey"] = ENV["KEY"]
faraday.adapter Faraday.default_adapter
end
response = conn.get
imported_reviews = []
results = JSON.parse(response.body)
results["reviews"].each do |item|
review = SomeModel.create(
title: item["title"],
body: item["text"],
posted_at: item["createdAt"],
link: "https://somelink.com/#{item["id"]}",
display_name: item["consumer"]["displayName"]
)
imported_reviews << review
end
imported_reviews
end
end
我的 model 只是樣板 model 所示:
class SomeModel < ApplicationRecord
end
這是我的規范文件some_service_spec.rb
。 我在 JEST 中寫了很多測試,但在 Ruby 中對我來說太陌生了。
# frozen_string_literal: true
require 'rails_helper'
describe TrustpilotService do
describe "#process" do
context 'with valid API_KEY' do
before :all do
WebMock.allow_net_connect!
end
after :all do
WebMock.disable_net_connect!(allow_localhost: true)
end
it "should import reviews to database" do
key = "90e0dbc7160d4024a1f12bc24b3d1def" #fake key#
some_review = create(title: 'Blah', body: 'Blah blah', posted_at: '2019-09-30T20:35:14Z', link: 'https://somelink.com/reviews/asdf123', display_name: 'Jane Doe')
some_review.save!
service = described_class.new
expect{ service.process }.to change{ SomeModel.count }
end
end
end
end
編輯添加了我的工廠以供參考
FactoryBot.define do
factory :trustpilot_review do
end
end
寶石文件
group :test do
gem "capybara", "~> 3.29.0"
gem 'database_cleaner'
gem 'factory_bot_rails'
gem 'rails-controller-testing'
gem 'rspec-rails', '~> 3.8'
gem 'rspec-snapshot', '~> 0.1.2'
gem "shoulda-matchers"
gem "simplecov", require: false
gem 'timecop'
gem "webdrivers"
gem 'webmock'
end
我基本上只是試圖復制另一個規范文件,該文件正在測試一個做同樣事情的服務,但我得到Factory not registered:
作為一個錯誤。 我創建了一個工廠,但不完全確定要在里面放什么。 所有關於 RSPEC 的信息都已經過時了。 如您所知,我對 Ruby 還很陌生,因此不勝感激。
如果這是您調用工廠的方式,那么您錯過了命名工廠:
some_review = create(title: 'Blah', body: 'Blah blah', posted_at: '2019-09-30T20:35:14Z', link: 'https://somelink.com/reviews/asdf123', display_name: 'Jane Doe')
嘗試
some_review = create(:trustpilot_review, title: 'Blah', body: 'Blah blah', posted_at: '2019-09-30T20:35:14Z', link: 'https://somelink.com/reviews/asdf123', display_name: 'Jane Doe')
在我看來,標題、鏈接等主要應該在工廠定義中,這是工廠的重點。
如果您想使用與 model 名稱不同的工廠名稱。 然后需要添加 class_name,如下所示:
FactoryBot.define do
factory :trustpilot_review, class: 'SomeModel' do
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.