Tag: tdd

如何打破RSpec超长规格?

有没有一种方法可以将模型的规格分解为某种层次结构? 我们的几个型号的规格已超过5000线,这降低了它们的可维护性。 我知道在一个理想的世界中,模型不够复杂,不需要这么大的测试,但这些模型实际上是来自Python科学库(系列和数据框架)的pandas对象的Ruby实现,所以我们不幸受此限制。 我希望能够通过逻辑运算来分割测试。 这可能吗? 理想情况下,我还希望使用单个命令运行模型的所有规范。

使用minitest进行多次测试

我有一个应用程序,其中一些规格写入minitest 。 像往常一样,我用rake开始。 因为有时我得到一个随机的结果,我的规格可以通过一次,而另一次失败。 在这种情况下,我可以保留序列号,并在修复后重播。 因为我有这种测试(随机结果),我通常运行rake很多次,只是为了确保应用程序没问题。 我想知道是否有一种很好的方法来执行多次rake测试(例如100次),如果出现任何故障或任何错误,请停止它们?

测试驱动开发 – 我应该测试数据库列和索引吗?

我是TDD的新手。 我发现shoulda gem能够测试数据库实体是否存在列以及测试其索引的能力。 但是有必要在我的测试套件中包含列和索引的测试吗? 我是否需要关注在开发过程中可能删除任何列和索引?

Rails – 测试夹具错误NoMethodError:nil的未定义方法`type’:NilClass

我在运行使用具有模型之间关联的夹具的测试时遇到问题。 一旦我运行rake test ,这就是我得到的错误: ERROR[“test_truth”, SevenPortfolioTest, 0.005154775] test_truth#SevenPortfolioTest (0.01s) NoMethodError: NoMethodError: undefined method `type’ for nil:NilClass ERROR[“test_should_destroy_item_video”, SevenPortfolio::ItemVideosControllerTest, 0.008887804] test_should_destroy_item_video#SevenPortfolio::ItemVideosControllerTest (0.01s) NoMethodError: NoMethodError: undefined method `type’ for nil:NilClass ERROR[“test_should_get_index”, SevenPortfolio::ItemVideosControllerTest, 0.011364416] test_should_get_index#SevenPortfolio::ItemVideosControllerTest (0.01s) NoMethodError: NoMethodError: undefined method `type’ for nil:NilClass ERROR[“test_should_create_item_video”, SevenPortfolio::ItemVideosControllerTest, 0.014584266] test_should_create_item_video#SevenPortfolio::ItemVideosControllerTest (0.01s) NoMethodError: NoMethodError: undefined method `type’ for nil:NilClass ERROR[“test_should_get_new”, SevenPortfolio::ItemVideosControllerTest, 0.017282812] […]

从rspec中的帮助程序规范访问会话

我的ApplicationHelper中有一个方法可以检查我的购物篮中是否有任何商品 module ApplicationHelper def has_basket_items? basket = Basket.find(session[:basket_id]) basket ? !basket.basket_items.empty? : false end end 这是我的帮助规范,我必须测试这个: require ‘spec_helper’ describe ApplicationHelper do describe ‘has_basket_items?’ do describe ‘with no basket’ do it “should return false” do helper.has_basket_items?.should be_false end end end end 但是,当我运行测试时,我得到了 SystemStackError: stack level too deep /home/user/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/testing/test_process.rb:13: 从调试开始,我看到在@ request.session的ActionDispatch :: TestProcess中正在访问该会话 ,并且@request是nil。 当我从我的请求访问会话specs @request是ActionController :: […]

如何模拟Net :: HTTP :: Post?

是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟这个方法: def method_to_test url = URI.parse uri req = Net::HTTP::Post.new url.path res = Net::HTTP.start(url.host, url.port) do |http| http.request req, foo: 1 end res end 这是RSpec: let( :uri ) { ‘http://example.com’ } specify ‘HTTP call’ do http = mock :http Net::HTTP.stub!(:start).and_yield http http.should_receive(:request).with(Net::HTTP::Post.new(uri), foo: 1) .and_return 202 method_to_test.should == 202 end 测试失败,因为似乎试图匹配NET :: HTTP :: Post对象: […]

我如何用minitest中的块来模拟?

希望MiniTest人员的一个简单问题.. 我有一段代码,我将在这里浓缩成一个例子: class Foo def initialize(name) @sqs = Aws::SQS::Client.new @id = @sqs.create_queue( queue_name: name ).fetch(:queue_url) @poller = Aws::SQS::QueuePoller.new(@id) end def pick_first @poller.poll(idle_timeout: 60) do |message| process_msg(message) if some_condition(message) end end 我如何模拟/存根/其他东西,以便我可以通过some_condition()进行测试并可能使用process_msg() ? 即我想测试@poller.poll(idle_timeout: 60) do |message| 。 我试图用模拟轮询器来存根Aws::SQS::QueuePoller#new ,但是它没有让消息传递给|message| 刚回来.. 这就是我所拥有的,这是行不通的 : mockqueue = MiniTest::Mock.new mocksqs = MiniTest::Mock.new mocksqs.expect :create_queue, mockqueue, [Hash] mockpoller = MiniTest::Mock.new […]

“autotest / rails 不存在。 中止”

我发现自动测试已停止工作…… $ autotest loading autotest/rails Autotest style autotest/rails doesn’t seem to exist. Aborting. 根据这篇博文 ,这个错误的常见原因是人们没有安装autotest-rails gem。 但是,我确实安装了: autotest-rails (4.1.0) ZenTest (4.1.4, 4.1.3, 4.1.1, 4.0.0, 3.11.1, 3.11.0, 3.10.0, 3.9.3, 3.9.2) 我今天或昨天没有安装任何新gem,尽管我昨天可能已经完成了gem update 。 我看到的另一个问题是与Ruby 1.9不兼容,但我使用的是MRI Ruby 1.8.6。

RSpec:我如何编写一个期望某些输出但不关心该方法的测试?

我试图了解测试驱动设计,特别是RSpec。 但是我遇到了RSpec Book的一些例子。 在本书中,我们测试$ STDOUT的输出如下: output = double(‘output’) game = Game.new output.should_receive(:puts).with(‘Welcome to Codebreaker!’) game.start() 嗯,这是一种时尚后的作品。 但是,为什么我应该关心Game对象是否使用puts()方法? 如果我把它改成print(),它真的会破坏测试吗? 而且,更重要的是,这不是针对TDD的主要原因之一 – 我应该测试该方法的作用(设计)而不是它是如何做的(实现)? 有没有什么方法可以编写一个测试,只测试最终在$ STDOUT上的内容,而不用看看它放在哪个方法?

使用Rspec连接链式方法

我想调用一个只返回一条记录的named_scope,但是named_scope返回一个数组,这不是什么大问题,因为我可以用.first链接它。 Model.named_scope(param).first 这是有效的,我正在努力的是如何存根链接的电话。 有没有人有关于如何通过Rspec嘲笑来实现这一目标的参考或答案?