使用minitest创建存根的正确方法是什么?

时间:2013-03-25 00:15:54

标签: ruby-on-rails minitest

我遇到了使用minitest (4.7.0)为我正在运行的测试创建存根的问题。我从以前的SO问题中研究了以下内容,但是它不起作用:

测试/模型/ book_test.rb

Book.stub :title, "War and Peace" do
  book = Book.new
  book.title.must_equal "War and Peace"
end

错误

NameError: undefined method 'title' for `Book'

应用/模型/ book.rb

class Book  
 #I tried adding the following according to the github readme but it doesn't work:
 #def title.fake_method
 #end
end

2 个答案:

答案 0 :(得分:1)

你试图在你的例子中存根什么/为什么对我来说并不完全合理,但是下面的内容会起作用并且似乎涵盖了你所追求的测试。

require 'minitest/autorun'

class StubbedBook
  def title
    "War and Peace"
  end
end

class BookTest < MiniTest::Unit::TestCase
  def test_title_is_war_and_peace
    book = StubbedBook.new
    assert_equal book.title, "War and Peace"
  end
end

答案 1 :(得分:0)

恕我直言,这将是一个工厂不是存根的好地方的例子。

假设Rails 3.2,ruby 1.9和bundler

将factory-girl-rails gem添加到您的Gemfile中。

创建工厂:

# test/factories/book_factory.rb
FactoryGirl.define do 
  factory :book do 
    title "book title"
  end
end

在单元测试中的先前操作(或设置)中。

before do 
  @book = FactoryGirl.build(:book)
end

或者如果您想要自定义标题:

before do 
  @book = FactoryGirl.build(:book, title: "random title")
end

然后您可以在测试中使用此实例变量。

注意,如果您愿意,也可以在个人测试中利用FactoryGirl。(build / create)。此外,如果您执行之前的任务,则可以通过后续(或拆卸)测试删除您创建的内容。