Carrier Wave 및 ActiveRecord::Base 모델에 새 이미지 업로드를 테스트하는 방법
8936 단어 todayilearnedrailsprogramming
개체 상태 관리가 어렵습니다.
저희는 Forem에 위치한 Rails 매장입니다. Forem code base에서 우리는 CarrierWave gem을 사용하여 파일 업로드를 돕습니다.
저번에 ensure an article’s cache updates when we update an organization’s image 로 작업했습니다. 이 문제를 해결하려면 실패한 테스트를 생성해야 했습니다.
아래는 제가 작성한 사양의 대략적인 근사치입니다. 그리고 사양이 실패했습니다. 이제 해당 테스트를 사용하여 버그를 수정할 수 있기 때문에 내가 원했던 것입니다.
RSpec.describe Organization do
context "when changing organization's profile image" do
it "updates the cached profile image for each associated article" do
organization = create(:organization, profile_image: File.open("/path/to/image"))
article = create(:article, organization: organization)
expect do
organization.update(profile_image: File.open("/path/to/other/image"))
end.to change { article.reload.cached_organization.profile_image }
end
end
end
효과가 있어야 한다고 생각했던 변경 사항을 적용했지만 효과가 없었습니다. 그래서 다른 몇 가지를 변경했는데 사양이 계속 실패했습니다. 왜요? 약간의 디버깅을 통해
organization.update(profile_image: File.open("/path/to/other/image"))
가 조직의 프로필 이미지를 업데이트하지 않는다는 사실을 알게 되었습니다.내가 찾은 것은 조직의 동일한 개체 인스턴스에 대해 두 번의 업로드를 수행할 수 없다는 것입니다. 즉, 조직 개체에 파일을 업로드하면 해당 인스턴스의 수명 주기 동안 다른 파일을 업로드할 수 없습니다.
이미지를 업데이트하려면 데이터베이스에서 레코드를 찾은 다음 이미지를 변경해야 했습니다.
다음은 내가 이러한 각 작업을 수행하는 "이유"를 설명하는 광범위한 인라인 주석이 포함된 보다 장황한 테스트입니다.
RSpec.describe Organization do
context "when changing organization's profile image" do
it "updates the cached profile image for each associated article" do
# What is going on with this spec? Follow the comments.
#
# tl;dr - verifying fix for https://github.com/forem/forem/issues/17041
# Create an organization and article, verify the article has cached the initial profile
# image of the organization.
original_org = create(:organization, profile_image: File.open(Rails.root.join("app/assets/images/1.png")))
article = create(:article, organization: original_org)
expect(article.cached_organization.profile_image_url).to eq(original_org.profile_image_url)
# For good measure let's have two of these articles
create(:article, organization: original_org)
# A foible of CarrierWave is that I can't re-upload for the same model in memory. I need to
# refind the record. #reload does not work either. (I lost sleep on this portion of the
# test)
organization = described_class.find(original_org.id)
# Verify that the organization's image changes. See the above CarrierWave foible
expect do
organization.profile_image = File.open(Rails.root.join("app/assets/images/2.png"))
organization.save!
end.to change { organization.reload.profile_image_url }
# I want to collect reloaded versions of the organization's articles so I can see their
# cached organization profile image
articles_profile_image_urls = organization.articles
.map { |art| art.reload.cached_organization.profile_image_url }.uniq
# Because of the change `{ organization.reload... }` the organization's profile_image_url is
# the most recent change.
expect(articles_profile_image_urls).to eq([organization.profile_image_url])
end
end
end
요약: 장착된 각 CarrierWave 업로더에 대해 개체 인스턴스
ActiveRecord::Base
당 한 번만 안정적으로 업로드할 수 있습니다. 교체하려면 새 인스턴스를 가져와야 합니다. 아니요, ActiveRecord::Base#reload
를 사용하면 작동하지 않습니다.
Reference
이 문제에 관하여(Carrier Wave 및 ActiveRecord::Base 모델에 새 이미지 업로드를 테스트하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/devteam/carrier-wave-and-how-to-test-uploading-a-new-image-to-a-activerecordbase-model-foj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)