2012-05-21 5 views
0

레일즈 3.2의 레이크 테스트 기능을 사용하고 있습니다. 나는 시험을 통과하려고 노력하고있다. 그러나 그것은 나에게 오류를주고있다. Btw, 내가 어떻게 쓰는지 보자. 나는 멍청 하네. 해킹 된 테스트 방법이지만 적어도 먼저 전달하려고합니다. 이 통과 아니에요 기능 어떻게 든간단한 테스트 통과

def new_product_title(title) 
    Product.new(title: title, 
     description: "yyy", 
     price: 1, 
     image_url: "fred.gif") 
end 

test "product title must have at least 10 characters" do 
    ok = %w{ aaaaaaaaaa aaaaaaaaaaa } 
    bad = %w{ a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa} 

    ok.each do |name| 
     assert new_product_title(name).valid?, "#{name} shouldn't be invalid" 
    end 

    bad.each do |name| 
     assert new_product_title(name).invalid?, "#{name} shouldn't be valid" 
    end 
    end 

.

여기에 이유가 무엇입니까? 그리고 그것을 쓰는 더 좋은 방법이 있습니까?

+0

오류 메시지를 게시하십시오. – uday

답변

1

나는이 방법에 더 관심이 있습니다. 이 방법이 제품 모델에 있다고 가정합니다. 당신이하려고하는 것은 분명히 모델에 의해 제어되어야하지만 클래스 정의 내에서 클래스의 메서드를 호출 할 수 있다고는 생각지 않습니다. 또한 특정 제목이 있지만 정적 설명, 가격 및 image_url 새 제품을 만드는 메서드에서 많은 유틸리티를 볼 수 없습니다. 특정 속성에 대한 기본값이 필요하면 초기화 메소드에서 기본값을 설정하고 필요할 경우 나중에 겹쳐 쓸 수 있습니다. 어떤 사람들은 초기화에 기본값을 설정 그래서 대신에이 같은 after_initialize 콜백을 설정할 수 있습니다에 싫은 내색 : 당신이 제목을 가진 새로운 제품을 만드는 데 필요한 때마다 다음

class Product < ActiveRecord::Base 
    after_initialize :init 

    def init 
    self.description ||= 'yyy' 
    self.price ||= 1 
    self.image_url ||= "fred.gif" 
    end 
end 

기본 방금

를 사용할 수있는 속성
Product.new(:title => "some title") 

그리고 당신은 모든 기본값을 원하지 않는 경우 당신은 당신의 검사 결과에 대해 평소

Product.new(:title => "some other title", :price => 400) # desc & url are still default 

같은 새에 값을 전달할 수 있습니다. 저는 항상 RSpec에서 테스트합니다. 테스트 유닛 (또는 미니 테스트 또는 현재의 테스트)을 사용하고 있기 때문에 필자의 조언은 정확하지 않습니다. 하지만 먼저 변수 이름을 더 잘 설명합니다. 두 번째로, 거기에 있으면 안되는 당신의 단언의 끝 부분에 몇 가지 쉼표가 있습니다.

test "product title must have at least 10 characters" do 
    valid_name = "a" * 10 
    short_name = "a" * 9 

    valid_product = Product.new(:name => valid_name) 
    assert valid_product.valid? 

    invalid_product = Product.new(:name => short_name) 
    assert invalid_product.invalid? 
end 

당신은 당신이 작업하는 제품이 어설가 invalid_product.errors.full_messages에 대한 방법과 오류에서 예상되는 문자열을 동일 사용하여 올바른 이유로 무효 확인 할 수 있음을 얻는 경우에.

+0

감사합니다. 이제 작동합니다! – user1372829