我有一个单例类,许多其他类和控制器可以访问该类来确定行为。如何在测试中设置单例值以便测试行为。下面的示例代码中,Setting 是一个 Singleton 类,它由数据库支持并存储应用程序范围的设置,并且管理员可以更改这些设置。Floodgate 是访问设置的类。
class Setting
def instance
@setting ||= new
end
end
class Floodgate
def self.whitelist
Setting.instance.flood_gate_whitelist
end
end
Run Code Online (Sandbox Code Playgroud)
以下是 Floodgate 的一些测试,需要访问设置数据库值。
describe Floodgate do
let(:setting) { Class.create(Setting).instance }
describe ".whitelist" do
it "returns a list of values on the Settings floodgate whitelist" do
expect(Floodgate.whitelist).to eq 'google'
end
end
describe ".allow_traffic_source?" do
it "returns true if traffic source is on the white list" do
expect(Floodgate.allow_traffic_source?('google')).to eq true
end
it "returns false if traffic source is not on the …Run Code Online (Sandbox Code Playgroud) 我正在按照此解决方案验证rails应用程序中服务类中的URL.测试返回false,但是在我用Ruby的URI类解析给定url时,在控制台中没有引发错误.我不认为我的代码中有任何拼写错误 - 我出错的任何建议?
class UrlService
attr_accessor :uri
def initialize(uri)
@uri = uri
end
def valid?
begin
uri = URI.parse(uri)
!uri.host.nil? && uri.kind_of?(URI::HTTP)
rescue URI::InvalidURIError
false
end
end
end
Run Code Online (Sandbox Code Playgroud)
测试
require "rails_helper"
RSpec.describe UrlService do
subject {described_class.new(url)}
describe "#valid?" do
context "success" do
let(:url) { "https://www.google.com/" }
it "returns true" do
expect(subject.valid?).to be_truthy
end
end
end
end
Run Code Online (Sandbox Code Playgroud)