【问题标题】:Ruby Minitest using stub from different testRuby Minitest 使用来自不同测试的存根
【发布时间】:2015-12-05 21:40:59
【问题描述】:

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

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) Failure:
TestBlog#test_title_is_treehouse [test.rb:12]:
Expected: "Treehouse Blog"
  Actual: "yyy"

我没有在每次运行中都遇到失败,我只是随机得到它,看起来存根正在被缓存之类的。

有什么想法吗?

非常感谢!

【问题讨论】:

  • 您在assert_equal 调用中的test_title_is_yyy 方法中有语法错误。缺少报价。

标签: ruby minitest


【解决方案1】:

您实现这一点的方式,实际上并没有对方法进行存根,而是替换它,并且每次首先运行test_title_is_yyy 时都会遇到相同的失败。修复方法是使用Object#stub 仅在块范围内替换存根方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2011-02-21
    • 2014-12-28
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多