预计#status最初是“ready_for_publish”,但已“准备好”

时间:2017-05-18 20:45:30

标签: ruby-on-rails rspec

我试图反复测试一些Rails模型。 但是像这样的错误让我烦恼。我该怎么办?

错误如下。

Failures:

  1) Article Article publish
     Failure/Error: expect{Article.publish(article.id,  1, "some comment")}.to change(article, :status).from(Article.statuses[:ready]).to(Article.statuses[:publish])
       expected #status to have initially been "ready_for_publish", but was "ready"
     # ./spec/models/articles_spec.rb:39:in `block (2 levels) in <top (required)>'

这是工厂数据。

FactoryGirl.define do
  factory :some_article , class: Article do
    current_version 1
    publish_version 1
    thumbnail ""
    status "ready_for_publish"
    publish_datetime "2017/01/01 00:00:00"
    user_id 1
    update_user_id 1
  end
end

模型

class Article < ApplicationRecord
  enum status: { publish: "publish", reject: "reject", ready: "ready_for_publish", wip: "work_in_progress", scrape: "scrape" }

  def self.publish(id, version, comment)
    article = Article.find(id)
    article_history = ArticleHistory.where(article_id: id, version: version)
    publish_at = article.try(:publish_at) || Time.now.to_s(:db)
    Article.transaction do
      article.update({
        publish_datetime: Time.now.to_s(:db),
        publish_at: publish_at,
        status: Article.statuses[:publish],
        current_version: version,
        publish_version: version
      })

      article_history.update({
        comment: comment
      })
    end
  end

测试代码

RSpec.describe Article, type: :model do
  login_admin

  let(:user) { @admin }
  let(:article) { FactoryGirl.create(:some_article) }
  let(:article_series) { FactoryGirl.create(:article_series) }
  let(:valid_attributes) {
    {
      current_version: 1,
      publish_version: 1,
      thumbnail: "uploads/article/thumb/thumb_20170327055055.png",
      status: "publish",
      publish_datetime: "2017-04-16 19:51:03",
      user_id: user.id,
      update_user_id: user.id,
      article_histories_attributes:[
        version: 1,
  (some code)

  it "Article publish" do
    expect{Article.publish(article.id,  1, "some comment")}.to change(article, :status).from(Article.statuses[:ready]).to(Article.statuses[:publish])
  end

我猜.from(Article.statuses[:ready])是可疑的,但无法修复它。如果你给出一些建议我会很感激。

1 个答案:

答案 0 :(得分:0)

更新数据库中的记录实际上并不会更改规范中内存中的article实例。

RSpec.describe Article, type: :model do

  # ...
  describe ".publish" do
    expect do
      Article.publish(article.id,  1, "some comment")
      article.reload!
    end.to change(article, :published?).from(false).to(true)
  end
end

除此之外,您的代码非常古怪。 ActiveRecord :: Enum用于将不同状态映射到整数列。让它映射到一个稍微不同的密钥字符串版本是很奇怪的。

class Article
  # The enum keys should be adjectives - not verbs
  enum status: [:draft, :ready, :published, :scrapped, :rejected]
end

有一个名为publish的类方法,它接受一个实例似乎也很苛刻 - ActiveRecord::Enum已经提供了变异方法:

article.published!
article.draft!

您可以覆盖这些或提供自己的实例方法来更改状态:

class Article
  # The enum keys should be adjectives - not verbs
  enum :status, [:draft, :ready, :published, :scrapped, :rejected]

  def publish!
    # ...
  end
end