gpt4 book ai didi

ruby - 如何使用 ruby​​ 和 MiniTest 伪造 Web 服务

转载 作者:太空宇宙 更新时间:2023-11-03 16:04:10 26 4
gpt4 key购买 nike

我正在编写一个 Rails 应用程序以使用 Twilio API 发送短信:

http://www.twilio.com/docs/api/rest/sending-sms

为此,我这样做:

client = Twilio::REST::Client.new account_sid, auth_token
client.account.sms.messages.create({
# stuff ...
})

这一切都很好——但是,我不希望我的测试发送一堆文本消息,因为那样会很愚蠢。所以,我想重写 Twilio::REST::Client.new 给我一个对象,让我可以在测试中调用 acccount.sms.messages.create 而不必大惊小怪。

我有一个可行的解决方案,但感觉很丑陋:

def mock_twilio_service(stub_client)
Twilio::REST::Client.stub :new, stub_client do
yield
end
end

class Recordy
attr_accessor :calls
def initialize
@calls = []
end

def method_missing(method, *args)
ret = self.class.new
@calls << {
method: method,
args: args,
block_given: block_given?,
ret: ret
}
yield if block_given?
ret
end
end

然后在我的测试中:

test "send a text" do
cli = Recordy.new
mock_twilio_service cli do
# ... stuff
end
end

我觉得我错过了一些非常明显的东西,但我不确定。我是吗?还是我完全找错了树? (是的,我看过 How do I mock a Class with Ruby? 但我不认为它完全一样......?)

最佳答案

另一个想法是使用 WebMock .当您的客户向 Twilio 发出请求时。您可以将请求 stub 。在 stub 中,您还可以定义从请求返回的内容以及可以使用哪些参数调用它。

当你设置

   WebMock.disable_net_connect!

可以肯定的是,测试无法发出真正的请求。

这样您就不会更改测试的任何行为,也不会依赖外部 API 让您的测试通过。

关于ruby - 如何使用 ruby​​ 和 MiniTest 伪造 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com