Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby – 使用和不使用Rails进行快速(Rspec)测试大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两节课:

1.@R_675_11096@是ActiveRecord的子类;它的工作是将销售数据保存到数据库中.

class @R_675_11096@ < ActiveRecord::Base
  def self.@R_23_10586@l_for_duration(start_date,END_DATE)
    self.count(conditions: {date: start_date..END_DATE})
  end
  #...
end

2.@R_675_11096@sReport是一个标准的Ruby类;它的工作是生成和绘制有关销售的信息.

class @R_675_11096@sReport
  def initialize(start_date,END_DATE)
    @start_date = start_date
    @END_DATE = END_DATE
  end

  def @R_675_11096@s_in_duration
    @R_675_11096@.@R_23_10586@l_for_duration(@start_date,@END_DATE)
  end
  #...
end

因为我想使用TDD并且我希望我的测试运行得非常快,所以我为@R_675_11096@sReport编写了一个不加载Rails的规范:

require_relative "../../app/models/@R_675_11096@s_report.rb"

class @R_675_11096@; end
# NOTE I have had to re-define @R_675_11096@ because I don't want to
# require `@R_675_11096@.rb` because it would then require ActiveRecord.

describe @R_675_11096@sReport do
  describe "@R_675_11096@s_in_duration" do
    it "calls @R_675_11096@.@R_23_10586@l_for_duration" do
      @R_675_11096@.should_receive(:@R_23_10586@l_for_duration)
      @R_675_11096@sReport.new.@R_675_11096@s_in_duration
    end
  end
end

当我运行bundle exec rspec spec / models / report_spec.rb时,此测试有效.

但是,当我运行bundle exec rake spec并且类@R_675_11096@(TypeError)的错误超类不匹配时,此测试失败.我知道错误正在发生,因为Tap是由@R_675_11096@.rb定义并在规范中内联.

所以我的问题是,如果没有定义该类,有一种方法可以将stub(或mock或DoublE)作为一个类吗?这将允许我删除内联类@R_675_11096@;结束,这感觉就像一个黑客.

如果没有,如何运行bundle exec rspec或bundle exec rake spec,我如何设置我的测试以使它们正确运行?

如果没有,我写快速测试的方法是错误的吗?!

最后,我不想使用Spork.谢谢!

解决方法

RSpec最近添加的stub_const专门针对以下情况设计:
describe @R_675_11096@sReport do
  before { stub_const("@R_675_11096@",Class.new) }

  describe "@R_675_11096@s_in_duration" do
    it "calls @R_675_11096@.@R_23_10586@l_for_duration" do
      @R_675_11096@.should_receive(:@R_23_10586@l_for_duration)
      @R_675_11096@sReport.new.@R_675_11096@s_in_duration
    end
  end
end

您可能还想使用rspec-fire来代替@R_675_11096@来使用测试双精度来自动检查真实@R_675_11096@类中存在的所有模拟/存根方法在运行带有加载的真实@R_675_11096@类的测试时(例如,当您运行测试套件时) :

require 'rspec/fire'

describe @R_675_11096@sReport do
  include RSpec::Fire

  describe "@R_675_11096@s_in_duration" do
    it "calls @R_675_11096@.@R_23_10586@l_for_duration" do
      fire_replaced_class_double("@R_675_11096@")
      @R_675_11096@.should_receive(:@R_23_10586@l_for_duration)
      @R_675_11096@sReport.new.@R_675_11096@s_in_duration
    end
  end
end

如果在真正的@R_675_11096@类上重命名@R_23_10586@l_for_duration,则在模拟方法时rspec-fire会给出错误,因为它在实际类中不存在.

大佬总结

以上是大佬教程为你收集整理的ruby – 使用和不使用Rails进行快速(Rspec)测试全部内容,希望文章能够帮你解决ruby – 使用和不使用Rails进行快速(Rspec)测试所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。