2009-09-26 21 views
6

Tôi đang tìm mã sạch và ngắn để kiểm tra tính hợp lệ trong Rails Unittests.Cú pháp đơn giản để thử nghiệm Các lỗi xác nhận

Hiện nay tôi làm điều gì đó như thế này

test "create thing without name" do 
    assert_raise ActiveRecord::RecordInvalid do 
     Thing.create! :param1 => "Something", :param2 => 123 
    end 
end 

Tôi đoán có một cách tốt hơn mà còn hiển thị thông báo xác nhận?

Giải pháp:

giải pháp hiện tại của tôi không cần thông qua một khuôn khổ là:

test "create thing without name" do 
    thing = Thing.new :param1 => "Something", :param2 => 123 
    assert thing.invalid? 
    assert thing.errors.on(:name).any? 
end 
+0

Cảm ơn s cho câu trả lời. Tôi sẽ thử rspec và những người khác một thời gian. Bây giờ tôi giúp bản thân mình với khẳng định (record.invalid?) Và assert_equal ([], record.errors.full_messages) – Roman

Trả lời

6

Bạn không đề cập đến những gì testing framework mà bạn đang sử dụng. Nhiều người có macro làm cho thử nghiệm activerecord một snap.

Đây là "chặng đường dài" để làm điều đó mà không cần sử dụng bất kỳ những người giúp đỡ kiểm tra:

thing = Thing.new :param1 => "Something", :param2 => 123 
assert !thing.valid? 
assert_match /blank/, thing.errors.on(:name) 
+0

Tôi chỉ sử dụng đồng bằng Rails tại thời điểm này. – Roman

+1

Vì Rails 3 không có phương thức "on" cho ActiveModel :: Errors. http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

Câu trả lời này có thể là ngày, nhưng 'assert_match' không hoạt động trên một mảng. –

0

Bạn có thể cung cấp cho các rspec-on-rails-matchers một thử. Cung cấp cho bạn cú pháp như:

@thing.should validates_presence_of(:name) 
+0

Trang này nói: Không sử dụng tôi. Tôi đã lỗi thời và tôi đã đột nhập. Shoulda làm việc với rspec ngay bây giờ. Dùng nó. – Roman

1

Hãy thử thêm accept_values_for đá quý. Nó cho phép để làm một cái gì đó như thế này:

describe User do 

    subject { User.new(@valid_attributes)} 

    it { should accept_values_for(:email, "[email protected]", "[email protected]") } 
    it { should_not accept_values_for(:email, "invalid", nil, "[email protected]", "[email protected]") } 
end 

Bằng cách này bạn có thể kiểm tra kiểm chứng thực thực sự phức tạp một cách dễ dàng

1

Tôi đang sử dụng Rails 2.0.5, và khi tôi muốn khẳng định rằng một mô hình sẽ thất bại xác nhận, tôi kiểm tra các errors.full_messages method, và so sánh nó với một mảng các tin nhắn dự kiến.

created = MyModel.new 
created.field1 = "Some value" 
created.field2 = 123.45 
created.save 

assert_equal(["Name can't be blank"], created.errors.full_messages) 

Để xác nhận rằng xác thực thành công, tôi chỉ so sánh với một mảng trống. Bạn có thể làm điều gì đó rất giống với kiểm tra xem bộ điều khiển Rails không có thông báo lỗi sau khi tạo hoặc yêu cầu cập nhật.

assert_difference('MyModel.count') do 
    post :create, :my_model => { 
    :name => 'Some name' 
    } 
end 

assert_equal([], assigns(:my_model).errors.full_messages) 
assert_redirected_to my_model_path(assigns(:my_model)) 
1

Đối với những người sử dụng Rails 3.2.1 trở lên, tôi thích sử dụng các phương pháp added?:

assert record.errors.added? :name, :blank 

tôi sử dụng một helper bài kiểm tra đó trông như thế này:

def assert_invalid(record, options) 
    assert_predicate record, :invalid? 

    options.each do |attribute, message| 
    assert record.errors.added?(attribute, message), "Expected #{attribute} to have the following error: #{message}" 
    end 
end 

nào cho phép tôi viết các bài kiểm tra như thế này:

test "should be invalid without a name" do 
    user = User.new(name: '') 

    assert_invalid user, name: :blank 
end 
Các vấn đề liên quan