【问题标题】:Ruby: Mocking a class method with MiniTest?Ruby:用 MiniTest 模拟类方法?
【发布时间】:2012-05-14 23:21:33
【问题描述】:

我正在使用MiniTest 2.12.1(Ruby >= 1.9 附带的最新版本的股票测试框架),我不知道如何用它模拟 类方法,与Mocha 之类的方法相同,例如:

product = Product.new
Product.expects(:find).with(1).returns(product)
assert_equal product, Product.find(1)

我已经涉足互联网好几天了,我仍然要找到一个合理的答案。请帮忙?

【问题讨论】:

  • 我认为用minitest/mock, duplicated? 做这种嘲笑是不可能的

标签: ruby mocking minitest


【解决方案1】:

如果您无法使用 2.12.1,这可能对您没有帮助,但看起来他们在 HEAD here 中为 minitest/mock 添加了方法存根。

那么,如果你更新到 minitest HEAD,我认为你可以这样做:

product = Product.new
Product.stub(:find, product) do
  assert_equal product, Product.find(1)
end

【讨论】:

  • 自从我写这篇文章以来他们似乎已经标记了一个新版本,所以不需要更新到 HEAD。最新版本现在是 3.5.0。如果您使用的是 bundler,您可以通过确保在 Gemfile 中有这样的一行来更新 minitest:gem 'minitest', '3.5.0'。如果您想使用 HEAD 版本,则可以在 Gemfile 中使用:gem 'minitest', :git => 'git://github.com/seattlerb/minitest.git'。如果您不使用 Bundler,我认为 gem update minitest 应该这样做。
  • 澄清一下:这不完全等同于问题中的 mocha 解决方案:.find 调用的参数未使用此解决方案验证...
【解决方案2】:

我所做的只是简单地存根类方法并将其替换为我自己的 lambda 函数,这证明调用了原始函数。您还可以测试使用了哪些参数。

例子:

  test "unsubscribe user" do
    user = create(:user, password: "Secret1", email: "john@doe.com", confirmation_token: "token", newsletter_check: false)

    newsletter = create(:newsletter, name: "Learnlife News")
    unsubscribe_function = -> (email:) { @unsubscribed_email = email }

    Hubspot::Subscription.stub :unsubscribe_all, unsubscribe_function do
      get user_confirmation_en_path(confirmation_token: "token")
    end

    assert_equal @unsubscribed_email, "john@doe.com"
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多