【问题标题】:rspec data scope between test and model测试和模型之间的 rspec 数据范围
【发布时间】:2013-12-04 16:38:13
【问题描述】:

我正在测试类似的东西:

describe "#check_name" do
  it 'should raise ArgumentError with equal name' do
    @article = Factory.build(:article)
    @article.id = 3
    lambda { @article.check_name(@article.id) }.
      should raise_error(ArgumentError)
  end
end

还有模特:

def check_name(article_id)
  tocheck = Article.find_by_id(article_id)
  if self.name == tocheck.name
    raise ArgumentError, "It has the same name!!!"
  end
end

调试模型,selfFactorybuild的值,就ok了。但是tochecknilArticle.find_by_id(article_id) 为零。

如果我正在调用@article.check_name(),并且模型中存在Article,那怎么可能无法查询?

抱歉,我可能不了解 vars 的范围或测试此类代码的正确方法。

[更新] 这是关于 ActiveRecord 的查找操作的范围。 测试这次加薪的正确方法是什么?

提前致谢!!!

【问题讨论】:

    标签: ruby-on-rails ruby rspec tdd


    【解决方案1】:

    ActiveRecord 的 find 操作进行数据库查找,而您的 Article 对象尚未保存到数据库中,因此是 nil 结果。

    虽然 Rails 验证机制可以避免使用这样的方法,而且如果不查看整个模型及其约束,很难指定哪种测试方法最好,但我认为选择是:

    • 使用测试替身返回find_by_id 结果,或
    • 在数据库中创建记录而不是仅仅“构建它”,然后构建具有相同名称的新记录,将check_name 消息发送到该新记录

    后者可能看起来像:

    describe "#check_name" do
      it 'should raise ArgumentError with equal name' do
        article = Factory.create(:article)
        expect { Factory.build(:article).check_name(article.id) }.to raise_error(ArgumentError)
      end
    end
    

    假设您的文章工厂对所有文章使用相同的名称。如果没有,您必须将第一篇文章的名称作为参数传递给第二篇文章的构建。

    【讨论】:

    • 谢谢,但是你知道测试这种代码的好方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多