如何在rails 5和minitest中创建存根方法

问题描述 投票:1回答:1

我有以下代码,我正在尝试为它创建一个存根,所以我可以在没有它的情况下进行测试。

def order
    client = StraightServerKit::Client.new(
        gateway_id: "123",
        secret: "123"
    )
    o = StraightServerKit::Order.new(amount: 1)
    mycelium_order = client.orders.create(o)
end

如何存根创建方法?这是我的尝试,但它不调用stubbed方法并尝试进行真正的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:undefined method new' for classStraightServerKit :: Client'

ruby-on-rails ruby minitest
1个回答
0
投票

测试似乎是一个控制器测试。您首先在测试中构建一个客户端并存根它的方法。该方法仅在此特定实例上存根,而不是在所有StraightServerKit::Client实例上存根。

然后你调用一个控制器动作来创建它自己的客户端,所以根本不使用你创建的存根。

您可以使用minitest-stub_any_instance gem,它允许您存根类的任何实例:

StraightServerKit::Client.stub_any_instance(:order, 'data')

© www.soinside.com 2019 - 2024. All rights reserved.