我有以下代码,我正在尝试为它创建一个存根,这样我就可以在不进行实际订单的情况下进行测试。
def order
client = StraightServerKit::Client.new(
gateway_id: "123",
secret: "123"
)
o = StraightServerKit::Order.new(amount: 1)
mycelium_order = client.orders.create(o)
end
如何存根创建方法?这是我的尝试,但它没有调用存根方法并尝试进行真正的api调用(此方法=> client.orders.create(o))
test "should create order" do
mock = Minitest::Mock.new
def mock.apply; true; end
client = StraightServerKit::Client.new(
gateway_id: "xxx",
secret: "xxx"
)
client.orders.stub :create, mock do
{
return_data = "data"
}
post post_order_path, params: { order: { amount: 10 } }
assert_response :success
end
方法1
使用stub_any_instance gem进行了更新,但由于嵌套方法
,仍然无法正常工作require 'minitest/stub_any_instance'
test "should create order" do
client = StraightServerKit::Client.new(
gateway_id: "asdf",
secret: "asdf"
);
client.stub_any_instance(:order, "data")
post post_order_path, params: { order: { amount: 10 } }
assert_response :success
end
错误: DashboardControllerTest#test_should_create_order: NoMethodError:#的未定义方法`stub_any_instance' (尽管stub_any_instance可以正常使用String.length)
方法2:
require 'mocha/mini_test'
test "should create order" do
StraightServerKit::Client.any_instance.stubs(:new).returns("test")
post post_order_path, params: { order: { amount: 10 } }
assert_response :success
end
这会加载实际的实现而不是存根
方法3:
test "should create order" do
StraightServerKit::Client.stub_any_instance(:new, "data")
post post_order_path, params: { order: { amount: 10 } }
assert_response :success
end
DashboardControllerTest#test_should_create_order:
NameError:未定义的方法new' for class
StraightServerKit :: Client'
答案 0 :(得分:0)
测试似乎是一个控制器测试。您首先在测试中构建客户端并使用它的方法。该方法仅在此特定实例上存根,而不是在StraightServerKit::Client
的所有实例上。
然后你调用一个控制器动作来创建它自己的客户端,所以你创建的存根根本就没用过。
您可以使用minitest-stub_any_instance gem,它允许您存根类的任何实例:
StraightServerKit::Client.stub_any_instance(:order, 'data')