2008-11-28 22 views
70

Tôi muốn kiểm tra Đối tượng được tạo bằng cách sử dụng Khung thực thể. Mối quan ngại của tôi là việc sử dụng Khuôn khổ thực thể có nghĩa là làm việc trực tiếp với nguồn dữ liệu. Vì vậy, bất kỳ ý tưởng làm thế nào để đơn vị thử nghiệm các thành phần dựa trên khung Entity?Thử nghiệm đơn vị với Khung thực thể

+0

Có thể trùng lặp với [Kiểm tra đơn vị con người bằng Entity Framework 6 như thế nào, bạn có nên bận tâm không?] (Https://stackoverflow.com/questions/22690877/how-are-people-unit-testing -with-entity-framework-6-should-you-bother) – Liath

Trả lời

51

Đối Enity Framework 4, điều này có vẻ đầy hứa hẹn: Testability and Entity Framework 4.0

+0

Sẽ đọc ngay bây giờ. Rất nhiều câu hỏi và câu trả lời kiểm tra của EF chưa được cập nhật, vì vậy +1 cho liên kết EF 4.0. – StuperUser

+1

Cửa hàng của chúng tôi đang bắt đầu thực hiện các kỹ thuật được thấy ở đây và có vẻ như câu trả lời cho đến nay. –

+3

FYI, ông không bao giờ phân phối bối cảnh trong các lớp UnitOfWork. Trong ví dụ này, http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application, UnitOfWork lớp thực hiện IDisposable. Kết hợp hai phương pháp tiếp cận và trang trí giao diện IUnitOfWork trong câu trả lời của Hans với IDisposible và triển khai mẫu Dispose ví dụ: http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.71).aspx –

-1

Làm thế nào về việc sử dụng một khung mocking? Dường như với tôi rằng một khuôn khổ mocking có thể giúp bạn isolaye logic kinh doanh của bạn từ cơ sở dữ liệu.

2

Tôi đồng ý, khung mocking là những gì bạn đang theo dõi. Bạn tạo các đối tượng "nhạo báng" không được lấy từ nguồn dữ liệu của bạn và bạn kiểm tra dữ liệu trong đối tượng đó. Cá nhân tôi đã làm việc với Moq, và tôi thích nó - đó cũng là Rhinomocks, cộng với những người khác.

4

Bạn sẽ muốn sử dụng Mocking Framework để truy xuất các giá trị giả hơn là nhấn dữ liệu thực. Dưới đây là một danh sách của một vài mocking frameworks và liên kết với một số Screencasts để giúp bạn bắt đầu:

Dưới đây là một số Screencasts về cách để bắt đầu :

+8

Bạn không thể làm điều này dễ dàng với EF. Câu trả lời của bạn là đúng cho các giao diện hoặc POCO mở rộng. – Will

3

Mặc dù những ví dụ có thể rất đơn giản tôi đã cố gắng để thảo luận về một giải pháp khả thi cho vấn đề này rất. Nó liên quan đến việc tách các mối quan tâm và người bạn thân của chúng ta Dependency Injection.

http://devblog.petrellyn.com/

Liên hệ với tôi nếu bạn muốn biết thêm chi tiết.

4

Tôi muốn chia sẻ một đầu vào khác cho điều này. Tôi đã có thể thử nghiệm các thành phần dựa trên Entity Framework và ứng dụng bằng cách sử dụng TypeMock Isolator. Tuy nhiên nó là thương mại.

Hãy nhìn vào bài đăng này: Introducing Entity Framework Unit Testing with TypeMock Isolator

+1

rất rất thương mại của nó! – BritishDeveloper

4

Do thực tế là phiên bản 1 của khung Entity phá vỡ một vài nguyên tắc thiết kế phần mềm lớn, có thực sự không có cách nào để áp dụng TDD khi sử dụng nó trong ứng dụng của bạn. Nghiên cứu của tôi chỉ NHibernate nếu bạn đang tìm kiếm một giải pháp ngay lập tức. Nó được thiết kế với thử nghiệm đơn vị trong tâm trí.

Tuy nhiên, nếu bạn có thể chờ đợi, dường như có hy vọng cho phiên bản tiếp theo của khung Entity: Test-Driven Development Walkthrough with the Entity Framework 4.0

0

Các BookLibrary mẫu áp dụng dự án WPF Application Framework (WAF) cho biết cách ứng dụng dựa trên Khuôn khổ thực thể có thể được kiểm tra đơn vị.

6

Cách tiếp cận rẻ là thiết lập tệp cơ sở dữ liệu với cấu trúc giống như cơ sở dữ liệu thực của bạn và đặt chuỗi kết nối trong cấu hình thử nghiệm đơn vị của bạn để trỏ đến đó. Cơ sở dữ liệu không cần phải có tất cả các bảng mà thực tế có; chỉ là những bài kiểm tra đơn vị cần.

Một bất lợi là bạn cần phải quản lý trạng thái của cơ sở dữ liệu để kiểm tra đơn vị không tác động lẫn nhau hoặc trong và giữa các lần chạy.

Tôi biết cách tiếp cận này hoạt động khi cả DB thực và đơn vị thử nghiệm sử dụng SQL Express nhưng tôi không biết về stubbing trong một SqlExpress DB cho một DB SQL đầy đủ.

Tôi nhận ra đây là thử nghiệm tích hợp về mặt kỹ thuật, nhưng nó có thể rẻ hơn so với việc tái cấu trúc mã của bạn hoặc học một khuôn khổ giả mạo.

Ví dụ kết nối thực chuỗi:

<add name="DrinksEntities" 
    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient 
    ;provider connection string=&quot;Data Source=localhost\sqlexpress;Initial Catalog=Drinks2;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

Ví dụ kết nối kiểm tra đơn vị chuỗi:

<add name="DrinksEntities" 
    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient 
    ;provider connection string=&quot;Data Source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\Inventory.mdf;Integrated Security=True;user instance=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 
+0

Tôi thích giá rẻ:) ... hoạt động như một nét duyên dáng :)! – Kiril

+4

Cho đến nay, đây là giải pháp tốt nhất cho tôi. Chạy toàn bộ cơ sở dữ liệu trong RAM nếu bạn muốn tăng tốc. Đây là những bài kiểm tra đầu cuối. Các giải pháp chế nhạo không có giải pháp nào cả. Điểm kiểm tra cơ sở dữ liệu không chỉ để kiểm tra lưu trữ liên tục mà còn để kiểm tra các truy vấn. Một thử nghiệm truy vấn chỉ có ý nghĩa khi nó thực sự được thực hiện - chế nhạo là một sự lãng phí thời gian tinh khiết ở đây - bạn cần dữ liệu bảng giả. Tôi đã thử tạo một tập hợp toàn bộ kho lưu trữ giả cho Linq2Sql nhưng đó là một sự lãng phí thời gian vì các truy vấn sử dụng các phép nối trái không thể được kiểm tra - tôi lo sợ vấn đề tương tự cũng xảy ra với EF. – user1040323

+2

thiết lập dữ liệu của bạn khá dễ dàng - đọc theo gợi ý của Microsoft về các thủ tục được lưu trữ thử nghiệm đơn vị. Cùng một hiệu trưởng được áp dụng - bạn bắt đầu một giao dịch, cắt bớt bảng và chèn dữ liệu thử nghiệm nào bạn cần; sau đó chạy thử nghiệm và cuối cùng là khôi phục giao dịch. DB kết thúc ở trạng thái bắt đầu và bạn có thể quản lý dữ liệu thử nghiệm của mình cho mỗi thử nghiệm. – gbjbaanb

0

Dưới đây là một tập hợp của các đơn vị mô hình làm việc + trong bộ nhớ cơ sở dữ liệu + mã thế t4 để tự động tạo ra một giả mạo EF dbContext.

http://mockingcompetence.wordpress.com/2013/05/20/fakingefdatacontext/

có một số vấn đề (LINQ không hợp lệ để truy vấn EF và không thực thi FK) với chính xác tái tạo một kết nối db EF thực vào lúc này.

Tuy nhiên, việc có một bối cảnh trong bộ nhớ để chạy thử nghiệm đơn vị gần như là điều cần thiết để có thể thực hiện TDD hoặc bất kỳ loại phương pháp thử nghiệm đơn vị nào khác.

Tôi sẽ đăng nội dung cập nhật lên liên kết ở trên khi tôi tìm hiểu thêm về các vấn đề.

2

Sau nhiều lần thất vọng với điều này, cuối cùng tôi đã có một giải pháp mà tôi hài lòng với ít nhất là một phần của vấn đề.

đầu tiên sử dụng một giao diện điều gì đó kho như:

public interface IRepository 
{ 
    IQueryable<T> GetObjectSet<T>(); 
} 

mà chúng ta có thể sử dụng để trở về hoặc là một trong bộ nhớ bộ sưu tập hoặc một bộ sưu tập DB hậu thuẫn thực sự. Tiếp theo gói gọn các truy vấn của bạn vào một đối tượng truy vấn với một giao diện trông giống như thế này.

public interface IQuery<T> 
{ 
    IQueryable<T> DoQuery(IQueryable<T> collection); 
} 

Bây giờ chia các bài kiểm tra đơn vị của bạn thành 2 nhóm. Nhóm đầu tiên sẽ kiểm tra xem các truy vấn của bạn có hợp lệ hay không.làm điều này như sau:

[TestMethod] 
public void TestQueryFoo() 
{ 
    using(var repo = new SqlRepository("bogus connection string")) 
    { 
     var query = new FooQuery(); // implements IQuery<Foo> 
     var result = query.DoQuery(repo.GetObjectSet<Foo>()); // as long as we don't enumerate the IQueryable EF won't notice that the connection string is bogus 
     var sqlString = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); // This will throw if the query can't be compiled to SQL 
    } 
} 

Tập thứ hai của đơn vị xét nghiệm sau đó có thể tự do kiểm tra logic kinh doanh của bạn mà không cần lo lắng về việc biên soạn bước SQL đó là, cho đến nay, nơi mà chúng tôi chạy vào những rắc rối nhất.

Không hoàn hảo bởi bất kỳ sự tưởng tượng nào, trình kích hoạt rõ ràng sẽ không được chạy, các ràng buộc triển khai DB có thể bị vi phạm, và một số vấn đề về bối cảnh và cơ sở dữ liệu không đồng bộ có thể bị cắt. Vì vậy, trong khi kết thúc để kết thúc kiểm tra hội nhập vẫn còn cần thiết nó có thể nắm bắt những gì là IMO vấn đề phổ biến nhất để cắt lên tại thời gian chạy trong các bài kiểm tra đơn vị đơn giản.

+0

Bạn có thể vui lòng cung cấp một số mã mẫu bằng cách sử dụng phương pháp này không? Tôi cũng muốn thử nghiệm đơn vị một dự án api 2 web đang sử dụng Khung thực thể –

0

Bạn có thể sử dụng cơ sở dữ liệu trong bộ nhớ để thử nghiệm mô hình Khung thực thể của bạn. Hãy xem here để biết thêm chi tiết

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