Ruby Minitest使用来自不同测试的存根

时间:2015-12-05 21:40:59

标签: ruby minitest

我正在尝试测试一个非常(非逻辑)的ruby类。

client2.o

这是我的测试:

class Post
  attr_accessor :title
  def initialize
    @title = "Treehouse Blog"
  end
end

class Blog
  def create_and_get_title
    post = Post.new
    post.title
    if post.title == nil
      post2 = Post.new
      post2.title
    else
      post.title
    end
  end
end

简单,对吧?但是,我从运行测试中得到以下输出:

require 'minitest/autorun'
require_relative 'blog'
require 'ostruct'

class TestBlog < Minitest::Test
  def setup
    @blog = Blog.new
  end

  def test_title_is_treehouse_blog
    assert_equal('Treehouse Blog', @blog.create_and_get_title)
  end

  def test_title_is_yyy
     def Post.new; OpenStruct.new(title: nil) end
     def Post.new; OpenStruct.new(title: 'yyy') end
    assert_equal('yyy, @blog.create_and_get_title)
  end
end

我没有在每次运行中得到失败,我只是随机得到它,看起来像存根被缓存或其他东西。

有什么想法吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您实施此方法的方式,您实际上并未对该方法进行存根,而是替换该方法,并且每次首先运行test_title_is_yyy时您都会遇到相同的故障。修复方法是使用Object#stub仅在块的范围内替换stubbed方法:

def test_title_is_yyy
  Post.stub(:new, OpenStruct.new(title: 'yyy')) do
    assert_equal('yyy, @blog.create_and_get_title)
  end
end

顺便说一下,如果您正在使用实例方法,那么使用def作为存根替换是完全正确的。您虽然在修改了一个类方法,但由于该类没有在测试之间重新加载,因此您在测试运行的剩余时间内重新定义了new