我试图反复测试一些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])
是可疑的,但无法修复它。如果你给出一些建议我会很感激。
答案 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