我在一个模型中有一个方法:
class Article < ActiveRecord::Base
def do_something
end
end
我为这个方法编写了一个单元测试:
# spec/models/article_spec.rb
describe "#do_something" do
@article = FactoryGirl.create(:article)
it "should work as expected" do
@article.do_something
expect(@article).to have_something
end
# ...several other examples for different cases
end
在我发现将这个方法移动到after_save
回调中更好之前,一切都很好:
class Article < ActiveRecord::Base
after_save :do_something
def do_something
end
end
现在我所有有关这个方法的测试都失败了。我必须通过以下方式修复它:
- 不再对
do_something
进行更为具体的调用,因为create
或save
也会触发该方法,否则将会遇到重复的数据库操作。 - 将
create
改为build
- 测试
respond_to
使用通用的
model.save
而不是单独的方法调用model.do_something
describe "#do_something" do
@article = FactoryGirl.build(:article)
it "should work as expected" do
expect{@article.save}.not_to raise_error
expect(@article).to have_something
expect(@article).to respond_to(:do_something)
end
end
测试通过,但我担心它不再只是关于特定的方法。如果添加更多回调,效果将与其他回调混合在一起。
我的问题是,是否有一种优美的方式可以独立地测试模型的实例方法,而不成为回调函数?