摩卡宝石如何嘲弄?

时间:2017-03-14 08:00:00

标签: ruby mocha

在我使用minitest测试我的产品之前,我是mocha gem的新手。然后我遇到了我的应用程序将工作发布到Facebook的情况。它选择一些工作,然后在Facebook上发布。 所以有人告诉我使用模拟,我发现了摩卡宝石。 我看到了一个样本测试。

  def test_mocking_an_instance_method_on_a_real_object
    job = Job.new
    job.expects(:save).returns(true)
    assert job.save
  end
  

但我没有理解。在我的工作控制器中,我有验证   并且无法成功保存空作业。但这里有嘲弄的   以上测试声明可以在没有必填字段的情况下保存作业。那么我们在上面的测试用例中究竟测试了什么?

1 个答案:

答案 0 :(得分:1)

这种做法通常有以下几个原因:

从隔离的角度来看:控制器的职责是处理传入请求并相应地触发操作。在我们给定的案例中,行动是:创建一个新的工作,并在一切适合的情况下向Facebook发布新帖子。 (请注意我们的控制器不需要知道如何发布到FB)

想象一下以下控制器动作:

def create
  job = Job.new job_params

  if job.save
    FacebookService.post_job job
    ...
  else
    ...
  end
end

我会测试它:

class JobsControllerTest < ActionController::TestCase
  test "should create a job and issue new FB post" do
    job_params = { title: "Job title" }

    # We expect the post_job method will be called on the FacebookService class or module, and we replace the original implementation with an 'empty/mock' method that does nothing
    FacebookService.expects :post_job

    post :create, job_params

    assert_equal(Job.count, 1) # or similar
    assert_response :created
  end
end

另一个好处是:FacebookService.post_job可能需要很长时间,并且可能需要互联网访问等,我们不希望我们的测试等待那些,特别是如果我们有CI。

最后我会在FacebookService测试中测试真正的FB发布,并且可能会发布一些其他方法,以防止每次测试运行时在FB上发布(它需要时间,互联网,FB帐户......)