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

时间:2018-01-01 10:58:41

标签: ruby-on-rails ruby minitest

我有以下代码,我正在尝试为它创建一个存根,这样我就可以在不进行实际订单的情况下进行测试。

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'

1 个答案:

答案 0 :(得分:0)

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

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

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

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