Ruby on rails开发从头来(windows)(二十六)- 使用Mock对象

前面我们测试了model和controller,学习了一些常用的测试方法,现在我们来深入学习几个有关测试的主题。第一个是使用Mock对象。

在很多时候,我们的程序和实际的环境有依存关系,比如现在的购物车,在汇款,结账的时候要接入网络上的银行账号,这样就造成了我们测试的时候必须要有internet环境。比如,我们在model目录里创建了一个payment_gateway.rb来处理网络银行相关的操作,我们在store_control.rb的save_order方法里这样写:

gateway = PaymentGateway.new
 response = gateway.collect(:login => 'username',
  :password => 'password',
  :amount => cart.total_price,
  :card_number => @order.card_number,
  :expiration => @order.card_expiration,
  :name => @order.name)

我们在gateway的collect方法中使用银行账号的用户名,密码等信息,但是这样一来,我们在测试的时候必须具有真实的internet环境,并且,我们不想在每次运行测试的时候都真正得去操作银行账户。

所以,我们需要的是一个假对象(mock)或PaymentGateway的一个替代品,在这里,rails为我们提供了方便,我们所要做的就是在test/mock/test/目录下创建一个payment_gateway.rb文件,用来覆盖app/models目录下的payment_gateway.rb,要注意,这两处的文件名必须完全一致。Mock文件的内容:

require 'models/payment_gateway'
class PaymentGateway
 def collect(request)
  # I'm a mocked out method
  :success
 end
end

这意味着我们用mock对象替代了真实的models目录下的PaymentGateway,而collect方法也返回一个假的响应。

在测试的时候,Rails会先到mock对象所在的目录查找,这样,加载的就是mock目录下的类,而不是真实的models目录下的类。

这样,通过使用mock对象,我们可以将精力放在重要的,优先级高的测试上,rails让这些工作变得简单。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索目录
, 对象
, 测试
, mock
, 一个
collect
ruby on rails、ruby on rails 教程、ruby rails、ruby on rails pdf、ruby on rails 5 教程,以便于您获取更多的相关知识。

时间: 2024-12-21 03:16:42

Ruby on rails开发从头来(windows)(二十六)- 使用Mock对象的相关文章

Ruby on rails开发从头来(五十六)- ActiveRecord基础(一对多关联关系)

一对多关联可以使我们表示一组对象,例如,一个order可以包含有任意多个line item,在数据库中,所有的line item记录都通过外键关联到特定的order. 在Active Record中,通过在父对象中的has_many来定义到子对象的关联,在子对象中使用belongs_to来指定父对象.我们已经在上一篇中了解了belongs_to声明,实际上,在一对多的情况下,和一对一是相同的,所以我们来了解has_many声明. 开发从头来(五十六)- ActiveRecord基础(一对多关联关

Ruby on rails开发从头来(四十六)- ActiveRecord基础(SQL和Active Record)

想象一下Active Record是如何处理SQL的,我们来看看find方法的:conditions参数,调用的时候像这样:find(:all,:conditions=>-),这里的:conditions参数决定了find方法将返回哪些记录,它相当于Sql语句的where部分,例如,要获取所有的名字为Dave,pay_type为po的订单,我们这样写: pos = Order.find(:all,:conditions => "name = 'dave' and pay_type =

Ruby on rails开发从头来(五十五)- ActiveRecord基础(一对一关联关系)

一对一关联,或者更正确的说是一对零或一对一关联,是通过外键引用到另外一张表中的至多一条记录实现的,下图描述了orders表和invoices表的关系: 开发从头来(五十五)- ActiveRecord基础(一对一关联关系)-rails activerecord"> 在Active Record中,要表示这样的关系需要在Order类中添加has_one:Invoice声明,并且同时在Invoice类中添加声明belongs_to:order,事实上,我们可以把这种关联关系看作是相互的,我们可

Ruby on rails开发从头来(五十二)- ActiveRecord基础(删除记录)

Active Record提供了两种方式进行删除操作.首先,有两个类级别的方法,delete和delete_all,这两个操作处在数据库层面上,delete()方法接收一个或一组和数据库对应的id,delete_all()方法删除所有符合指定条件的记录,如果没有指定条件,就会删除所有的记录.方法的返回值和具体的数据库适配器相关,例如oracle返回被影响的行数.如果没有记录被删除,也不会抛出异常. Order.delete(123) User.delete([2,3,4,5]) Product.

Ruby on rails开发从头来(四十二)- ActiveRecord基础(主键和ID)

也许你已经注意到了,在我们前面的代码中,数据库定义里都使用了一个integer型的字段id作为主键,这是Active Record的一个约定. 或许你要问,为什么不用订单编号或者某个有意义的列来作为主键呢?使用id作为主键有一个很重要的原因,就是如果使用具有内在格式的主键的话,随着时间推移,有可能其中的规则也会变化.例如,使用ISBN号码来给book表做主键,毕竟ISBN号码是唯一的,但是,有可能当一本书写完后,美国的出版业已经发展了并且在所有的ISBN号码后又附加了一位数字. 如果我们使用了I

Ruby on rails开发从头来(四十)- ActiveRecord基础(Boolean属性)

一些数据库支持boolean类型,而另一些则不支持,这使得Active Record要抽象boolean类型变得困难.例如,如果数据库不支持boolean类型,有的开发者使用char(1)来替代,而内容使用"t"和"f"来表示true和false,而另外一些开发者使用integer类型,0是false,1是true.即使数据库支持boolean类型,在内部也许还是使用0和1来存储. 在Ruby里,在条件判断中,数字0和字符f都被认为是true值,这就意味着如果你直接

Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)

预加载子记录讨论的问题和"延迟加载"是相同的.通常Active Record会推迟从数据库中加载子记录,直到你需要他们,例如,通过Rdoc中的例子,我们假定博客程序有一个Model,像下面这样: class Post < ActiveRecord::Base belongs_to :author has_many :comments, :order => 'created_on DESC' end 如果我们遍历所有的post,访问作者和评论属性,我们使用一个Sql查询来返回

Ruby on rails开发从头来(五十八)- ActiveRecord基础(自关联)

或许存在这样的情况,在一个表中,一条记录关联到表中的另一条记录,例如,公司中的每个雇员都有上级和下级,而他们同时又是雇员,在Rails中你可以这样使用Employee类: class Employee < ActiveRecord::Base belongs_to :manager, :class_name => "Employee", :foreign_key => "manager_id" belongs_to :mentor, :class_

Ruby on rails开发从头来(五十四)- ActiveRecord基础(指定关联关系)

Rails支持三种表间关联关系,一对一,一对多,多对多,你需要在Model中加入声明来标识这些关联:has_one,has_many,belongs_to,has_and_belongs_to_many. 一对一关联关系可能存在于象订单和发票这样的关系,一个订单只能有一个发票,在Rails中,我们这样指明: class Order < ActiveRecord::Base has_one :invoice . . . class Invoice < ActiveRecord::Base bel

Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)

前面了解了检索的方法,这次来看看Active Record怎样更新数据库中的记录. 如果你有一个Active Record对象(或许对应于order表),你可以通过调用save方法将它写道数据库中去,如果这个对象是先前从数据库中读取出来的,save方法将会更新既有的记录,否则将会新建一条记录. 如果一条既有记录被更新,Active Record将会用它的主键和来匹配内存中的对象,Active Record对象中的属性被更新到对应的列,即使一个列中的值没有变化也会被更新,在下面的例子中,id为12