在我使用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
但我没有理解。在我的工作控制器中,我有验证 并且无法成功保存空作业。但这里有嘲弄的 以上测试声明可以在没有必填字段的情况下保存作业。那么我们在上面的测试用例中究竟测试了什么?
答案 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帐户......)