测试概念之mock篇

接上一篇,这篇说说mock是啥。

呃,看了一些别人写的文章,似乎对于mocks,stubs,doubles没什么特别的限制,随便用的感觉。新手对此表示很懵逼。

以下内容属于小白对mock的理解,如有误人子弟的嫌疑,非常欢迎拍砖:P

正文

说mock前,先来说说double。

Double在英文中有替身的含义。当你double一个真实的对象时,相当于给这个对象创建了一个替身。

mocks 和stubs有时候也被称之为doubles。

那mocks 和stub有什么区别?

看到一篇文章RSpec, Test Double, Mock, and Stub, 上面提到Mock是对象层面的Stub是方法层面,个人觉得挺在理的。

用实例来说说mock的使用。

上一篇,测试了两个行为,验证search_tmbd是否调用了find_in_tmdb, 验证最后的结果是否render到了search_tmbd.html.erb这个template。但是还有一个我们没有测试的,就是find_in_tmdb返回的结果是否可用于这个template。

movies_controller.rb中,修改search_tmbd这个method,将搜索结果赋值给到@movies:

然后我们的测试代码是这样子的:

这里用mock(‘Moive’),创建了一个假的movie对象,并赋值给@fake_results。用stub来调用find_in_tmdb后,返回值是@fake_results。最后except assigns(:movies).to eq(@fake_results) 显示我们预期实例变量movies的赋值结果是等于@fake_results的。

运行测试,pass。

说了这么多,我的理解是mock创建了对象的替身,来模拟对象的行为。

The End

附上一份RSpec的烹饪教程,来自Edx:

RSpec Cookery

  • Each spec should test just one behavior
  • Use seams(stub,mock, double) as needed to isolate that behavior
  • Determine what type of expectation will check the behavior
  • Write the test and make sure it fails for the right reason
  • Add code until test is green
  • Look for opportunities to refactor/beautify