7

Cân nhắc một người mới bắt đầu giao dịch với Dependency Injection. Chúng tôi đang phân tích hai lớp có liên quan trong NerdDinner.Tiêm phụ thuộc vào NerdDinner - thực sự kiểm tra kho lưu trữ hoặc mô hình của bạn

DinnerRepository từ ứng dụng: Repo image

FakeDinnerRepository từ các bài kiểm tra: Fakes image

Họ thực hiện logic khác nhau, trong đó tất nhiên là cần thiết, như ý tưởng then chốt ở đây là để thực hiện IDinnerRepository và cung cấp các triển khai và thành viên riêng khác nhau.

Tôi hiểu bài kiểm tra dành cho bộ điều khiển, nhưng tôi lo ngại rằng có hai cách triển khai logic truy cập dữ liệu khác nhau. Hãy xem xét bất kỳ dự án nào sử dụng bất kỳ loại ORM, ADO.NET, SubSonic hoặc bất kỳ hương vị nào của truy cập dữ liệu bạn muốn. Có, bạn có thể thiết lập kho lưu trữ giả của mình để khớp với repo thực.

Nỗi lo lắng của tôi là theo thời gian, chi tiết triển khai trong thay đổi thực repo. Có thể lỗi đánh máy hoặc một số thay đổi chi tiết thực hiện quan trọng khác trong truy vấn . Điều này dẫn đến một sự không phù hợp tiềm năng của logic trong Mô hình giữa giả và repo thực. Sự lo lắng là việc thực hiện repo thực và kiểm tra repo được ra khỏi đồng bộ.

Câu hỏi:

  • Làm thế nào bạn sẽ thử nghiệm mô hình trong trường hợp này?
  • Thích hợp để kiểm tra mô hình?
  • Đây có phải là vấn đề kỷ luật để đảm bảo kiểm tra của bạn theo kịp với việc thực hiện logic nghiệp vụ không?

Trả lời

4

Đây có thể không phải là câu trả lời hoàn chỉnh cho câu hỏi của bạn, nhưng tôi sẽ cố gắng tham gia vào đó.

Giao diện - trong trường hợp này IDinnerRepository - phải được xem là hợp đồng . Điều đó có nghĩa là bất kỳ việc triển khai nào cũng phải thực hiện hợp đồng này. Nếu phương thức là FindAllDinners(), thì đó là cơ bản những gì nó nên làm. Một kho lưu trữ giả được sử dụng để kiểm tra đơn vị thường có thể đơn giản hơn rất nhiều so với thực tế (sử dụng một từ điển), vì vậy việc tuân thủ thực hiện thực sự không nên được xem như là một vấn đề, thay vì xem nó như là một yêu cầu.

Lý do cho kho lưu trữ giả tồn tại ở nơi đầu tiên là thử nghiệm. Về cơ bản, tất cả mọi thứ có thể được kiểm tra nên được kiểm tra. Và lấy cơ sở dữ liệu ra khỏi phương trình là điểm của một kho lưu trữ giả trong bộ nhớ. Truy cập dữ liệu không phải là điểm của thử nghiệm, vì vậy chúng tôi thay thế nó. Kho lưu trữ giả mạo nhanh hơn rất nhiều để thiết lập và sử dụng, và chúng ta có thể dễ dàng đảm bảo rằng repo đang ở trạng thái mà nó cần cho mã đang thử nghiệm để vượt qua.

Vì vậy, những gì bạn làm là chuyển mô hình một bản sao kho lưu trữ giả trong các bài kiểm tra đơn vị của bạn và đảm bảo rằng bất kỳ điều gì xảy ra trong mã mô hình được phản ánh trong kho giả.

Tôi nghĩ bạn sẽ thấy rằng trên thực tế, sẽ không có vấn đề gì để giữ cho các kho lưu trữ được đồng bộ hóa. Nếu yêu cầu thay đổi, bạn sẽ thay đổi giao diện và cả hai triển khai sẽ cần phải thay đổi.Nếu ý định thay đổi, có thể bạn sẽ đến một điểm mà các bài kiểm tra đơn vị của bạn bắt đầu phá vỡ.

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn Rune. Điều đó có ý nghĩa. Tôi đoán cơ sở của câu hỏi là: bạn có nên kiểm tra quyền truy cập dữ liệu của mình không? Có vẻ như bạn đang nói 'không'. –

+0

Đó thực sự là một trong những điều tôi đấu tranh với bản thân mình như là một TDDer bắt đầu. Cách mà tôi hiện đang hiểu nó, các xét nghiệm đơn vị của bạn nên để lại quyền truy cập dữ liệu thực tế một mình, trong khi nó là một ý tưởng tốt để có các bài kiểm tra tích hợp cũng kiểm tra rằng truy cập dữ liệu thực sự hoạt động tốt. Các bài kiểm tra tích hợp này sẽ chậm hơn, nhưng điều đó nên được chấp nhận vì chúng có thể sẽ không chạy thường xuyên như các bài kiểm tra đơn vị "thuần túy". –

2

Không có gì là FakeDinnerRepository là kiểm tra mã yêu cầu IDinnerRepository. Không tự mình kiểm tra DinnerRepository. Nếu chúng ta sử dụng một kho chứa bữa ăn tối thực để kiểm tra những thứ như DinnerController, chúng ta sẽ không chỉ kiểm tra chức năng của DinnerController mà còn cả việc truy cập dữ liệu. Mặc dù các bit truy cập dữ liệu chắc chắn sẽ được kiểm tra, chúng không được kiểm tra trong các kiểm tra của bộ điều khiển bữa ăn tối.

Kiểm tra quyền truy cập dữ liệu của bạn là một chủ đề khá gây tranh cãi. Tôi tin rằng lý do mà hầu hết mọi người bỏ nó ra khỏi các bài kiểm tra đơn vị của họ đơn giản là phải mất nhiều thời gian hơn để thực thi. Việc truy vấn cơ sở dữ liệu sẽ thêm một tấn thời gian vào thử nghiệm của bạn mà hầu hết các nhà phát triển không muốn chịu đựng.

Cho dù quyền truy cập dữ liệu của bạn được kiểm tra trong các bài kiểm tra đơn vị hay kiểm tra chức năng chính thức khác là tùy thuộc vào bạn. Nhưng nó chắc chắn cần phải được kiểm tra. Cá nhân, tôi là một fan hâm mộ của việc có các bài kiểm tra đơn vị giao dịch cho lớp truy cập dữ liệu. Chỉ cần đảm bảo rằng bạn chỉ đang thử nghiệm các truy vấn của mình và không kiểm tra xem ORM của bạn có đang hoạt động đúng không (đó là công việc ORM).

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