2017-01-23 18 views
6

Hiện tại, tôi có các kiểm tra đơn vị không sử dụng Tên công ty "Faker".Kiểm tra bộ điều khiển Rspec không thành công với Dấu nháy đơn?

có vẻ như là expect(response.body).to match(@thing.name) là điều gì đang làm rối tung lên.

Khi xem lỗi, tên công ty Faker đôi khi sẽ có những thứ như "Công ty O'Brian" hoặc "Công ty O'Hare" hoặc tương tự.

Là trình tạo chuỗi được mã hóa? vì tôi biết không phù hợp với các chuỗi được mã hóa và tôi thực sự không muốn chỉ định một tên công ty cụ thể trong Nhà máy đang sử dụng.

Cảm ơn

+0

Tôi tò mò vì sao bạn cảm thấy câu trả lời của tôi không đủ. Bất cứ điều gì tôi có thể làm rõ? –

+0

Vấn đề với bao gồm là nếu nó "chứa" nó, tôi muốn nó để phù hợp với nó hoàn toàn và không chỉ là từ "tồn tại" trong tên. Mặc dù tôi có thể sử dụng nó như là một dự phòng, trong đó bệnh đánh dấu câu trả lời của bạn chính xác :). Im thực sự chỉ cố gắng tìm kiếm các khả năng khác. – msmith1114

Trả lời

5

Trình tạo giả sẽ không thực hiện bất kỳ mã hóa nào cho bạn. Nó sẽ chỉ cung cấp cho bạn một chuỗi như O'Malley. Nhưng phản hồi phải có HTML thoát (hoặc một số loại khác, tùy thuộc vào định dạng), như O'Malley. Bạn luôn có thể puts response.body để xem chắc chắn.

Bộ kết hợp RSpec matches được thiết kế thực sự for either expected or actual to be a regular expression, nhưng trong trường hợp của bạn cả hai đều là chuỗi. Bởi vì mã số has an optimization calling values_match?does a simple comparison, bạn đang nói một cách hiệu quả expect(response.body).to eq(@thing.name).

Nếu bạn muốn có cụm từ thông dụng, bạn phải cẩn thận khi sử dụng các giá trị không được kiểm soát để tạo ra nó. May mắn thay Ruby có Regexp.escape cho điều đó, vì vậy bạn có thể nói Regexp.new("foo" + Regexp.escape(@thing.name) + "bar"). Nhưng từ phản đối của bạn đến include, có vẻ như bạn thực sự muốn phản hồi không chứa gì ngoài tên, phải không? Trong trường hợp đó, bạn không cần một regex nào cả.

Trong mọi trường hợp, sự cố không phải là về những gì xung quanh tên nhưng cách thoát tên. Vì vậy, trước khi so sánh bạn nên (1) giải mã phản hồi hoặc (2) mã hóa chuỗi kẻ giả mạo. Nó không thực sự quan trọng. Cả hai đều khá dễ dàng:

expect(CGI.unescapeHTML(response.body)).to eq @thing.name 

hoặc

expect(response.body).to eq CGI.escapeHTML(@thing.name) 

Đương nhiên, nếu câu trả lời của bạn là JSON, bạn nên thay thế tất cả HTML này thoát thứ với JSON vv

+0

Câu hỏi nhanh: CGI này trong các chức năng "mong đợi" của bạn là gì. Đó có phải là mã hóa chúng không? – msmith1114

+0

CGI là một phần của thư viện chuẩn của Ruby: https://ruby-doc.org/stdlib-2.3.0/libdoc/cgi/rdoc/CGI.html –

3

Bạn có thể thử sử dụng #include thay vì sử dụng #match.

expect(response.body).to include(@thing.name) 
2

Bạn có thể thử đi qua một biểu thức chính quy thay cho chuỗi:

expect(response.body).to match(Regexp.new(@thing.name)) 

Ngoài ra, Nếu vấn đề là chỉ khi bạn nhận được loại tên từ kẻ giả mạo, sau đó bạn nên xem xét này QA, Nó cung cấp một số thông tin chi tiết tốt.

+0

Tôi đoán vấn đề trong KHÔNG sử dụng nó, là tôi sẽ cần phải xác định rất nhiều dữ liệu thử nghiệm mẫu. Nhưng theo một cách nào đó nó tốt vì nó hiển thị các vấn đề với các giá trị kỳ quặc chẳng hạn. – msmith1114

2

Giả sử bạn đang đề cập đến Faker::Company của số Faker đá quý

Cách chính xác để làm cho ví dụ của bạn vượt qua sẽ là sử dụng Regexp như trong ví dụ @rafael-costa. Làm như vậy thoát khỏi những thứ như dấu nháy đơn.

Vấn đề với việc sử dụng Faker là các thử nghiệm của bạn không xác định.Cách tốt nhất là cung cấp các đầu vào tĩnh, được biết đến cho thử nghiệm của bạn và mong đợi các kết quả đầu ra vượt qua các kỳ vọng nhất định dựa trên các yếu tố đầu vào đó. Rất khó để cung cấp một ví dụ thích hợp mà không có thêm thông tin nhưng có thể giống như sau:

Ngoài ra, bạn thường không nên kiểm tra đầu ra của thân máy cụ thể trong thông số bộ điều khiển. Để làm như vậy là thử nghiệm trên các mục đích. Bạn sẽ thường là write a view test cho điều đó.

Các vấn đề liên quan