接上一篇,这篇说说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