【发布时间】:2019-08-26 20:03:14
【问题描述】:
我对一个如下所示的对象进行了一些测试:
let(:bot) { MyObject.new('/some/config/file.json') }
问题是,实例化 MyObject 的行为本身就创建了一个 HTTP 请求。我实际想要测试的以下方法根本不会创建 HTTP 请求。例如:
it "should parse Jira ticket key answers correctly" do
expect(bot.offline_method(good_answer) == correct_outcome).to eq(true)
expect(bot.offline_method(bad_answer) == correct_outcome).to eq(false)
end
如何将 MyObject.new 本身的实例化存根?
对于其他上下文,MyObject.new 使用 google drive gem 实例化一个会话。
如果我打开一个交互式 Ruby 环境并按如下方式实例化机器人,它会告诉我输出是这样的:
bot = MyObject.new('/some/config/file.json')
=> #<Object:0x007f6d07a10b50 @session=#<GoogleDrive::Session:0xabcdef1234567>, @MyObject_spreadsheet_responses_1=#<GoogleDrive::Worksheet spreadsheet_id="123456789abcdefghjijklmnopqrstuvwxyz", gid="123456789", title="title of first google sheet">, @MyObject_spreadsheet_responses_2=#<GoogleDrive::Worksheet spreadsheet_id="123456789abcdefghjijklmnopqrstuvwxyz", gid="1687481303", title="second_spreadsheet_title">>
那么我到底该如何存根
let(:bot) { MyObject.new('/some/config/file.json') }
??
我知道我想要类似的东西:
allow_any_instance_of(MyObject.new).to return {
#<Object:0x007f6d07a10b50 @session=#<GoogleDrive::Session:0xabcdef1234567>, @MyObject_spreadsheet_responses_1=#<GoogleDrive::Worksheet spreadsheet_id="123456789abcdefghjijklmnopqrstuvwxyz", gid="123456789", title="title of first google sheet">, @MyObject_spreadsheet_responses_2=#<GoogleDrive::Worksheet spreadsheet_id="123456789abcdefghjijklmnopqrstuvwxyz", gid="1687481303", title="second_spreadsheet_title">>
}
但我真的不知道我想要什么确切的语法或如何找到它。
感谢您的帮助!
【问题讨论】:
-
您使用什么库来发出请求?请分享实际发出 HTTP 请求的代码和您要测试的方法。
-
github.com/gimite/google-drive-ruby 将 MyObject.new 方法存根返回 nil 就足够了,因为 MyObject 的内部方法实际上与谷歌表没有任何关系?这会是什么样子?
标签: ruby-on-rails ruby unit-testing testing rspec