我正在尝试测试一个非常(非逻辑)的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
我没有在每次运行中得到失败,我只是随机得到它,看起来像存根被缓存或其他东西。
有什么想法吗?
非常感谢!
答案 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
。