2010-05-05 44 views
13

cách tốt nhất để viết các bài kiểm tra đơn vị bằng LINQ to SQL DAL là gì?Thử nghiệm đơn vị với Lớp Truy cập Dữ liệu

Hiện tại tôi đang thực hiện một số kiểm tra cơ sở dữ liệu và cần tạo các phương thức trợ giúp truy cập cơ sở dữ liệu, nhưng tôi không muốn các phương thức đó trong repo chính của mình.

Vì vậy, những gì tôi có là hai bản sao của DAL, một bản trong dự án chính của tôi và một trong dự án thử nghiệm. Việc quản lý những thứ này có dễ dàng hơn không nếu tôi tạo một dự án riêng cho lớp dữ liệu? Tôi không chắc cách nào là cách tốt hơn để tiếp cận điều này.

Nếu tôi tạo dự án lớp dữ liệu, tôi có thể di chuyển tất cả repo của tôi vào dự án đó không? Tôi không chắc chắn làm thế nào để thiết lập đúng các lớp.

Cảm ơn

+0

Tôi đọc "Nếu tôi tạo dự án lớp dữ liệu, tôi có thể di chuyển tất cả repo của mình vào dự án đó không?" câu hỏi như bạn đã sử dụng mẫu kho lưu trữ được đề xuất trong các câu trả lời dưới đây, nhưng dường như bạn cũng phải thực hiện một số loại truy cập cơ sở dữ liệu, trong một số thử nghiệm của bạn? Thông thường điều này có nghĩa là bạn đang thực sự kiểm tra LINQ to SQL, điều mà tôi mong đợi các kỹ sư của Microsofts đã làm.Tôi sẽ khuyên bạn nên tránh những phương pháp đó và kiểm tra các kho lưu trữ của bạn với phần phụ trợ bộ nhớ, như được mô tả trong bài viết Jason Jones liên kết đến. – AHM

Trả lời

5

Tôi đang sử dụng Linq2Sql cho lớp DAL và tôi có nó như một dự án riêng biệt. Trong dự án miền của tôi, tôi có một giao diện kho lưu trữ mà sau đó tôi thực hiện bằng cách sử dụng một Linq2SqlCarRepository tùy chỉnh trong dự án DAL của tôi, lớp này kết thúc tốt đẹp các lớp Linq2Sql được tạo ra.

ví dụ: Trong dự án Car.Core

public interface ICarRepository 
{ 
    IQueryable<Car> GetAllCars(); 
    void Add(Car); 
} 

sau đó tôi có một thực hiện của giao diện mà kết thúc tốt đẹp truy cập vào các lớp Linq2Sql tạo ra.

dự án Car.Data

public class SqlCarRepository : ICarRepository 
{ 
    private CarDataContext _context; 

    public SqlCarRepository() 
    { 
     _context = new CarDataContext(); 
    } 

    #region ICarRepository Members 

    public IQueryable<Car> GetAllCars() 
    { 
     return _context.Cars; 
    } 

sau đó tôi có một dự án thử nghiệm Car.Data.Test mà sau đó sử dụng mocks để chế nhạo các ICarRepository và kiểm tra đi. Tôi nghĩ điều này hơi khác với những gì bạn mô tả. Nhưng tôi nghĩ bạn muốn thử và tách riêng DAL khỏi ứng dụng của bạn để nó là một thiết bị ngoại vi có thể được hoán đổi nếu bạn muốn.

tôi đã không có tất cả các hoàn toàn sắp xếp nhưng tôi hiện đang có các dự án:

Car.Core   --- All the interfaces and domain objects, DTO's etc 
Car.Core.Tests --- The tests of the core business logic. 
Car.Web   --- Asp.net MVC frontend 
Car.Web.Tests --- Tests for the website 
Car.Data   --- The Linq2Sql stuff lives in here 
Car.Data.Tests --- The tests for the DAL layer 

Đó là những gì tôi đã hiện có mặc dù nó có thể không phải là cách tốt nhất để làm điều bây giờ.

Tôi khuyên bạn nên đọc qua số The Onion Architecture và xem các video MVC StoreFront để lấy cảm hứng; chúc may mắn.

6

Tôi sẽ sử dụng Mẫu lưu trữ được nêu trong bài viết tháng 9 năm 2009 trong tạp chí Visual Studio có tiêu đề "Loại bỏ phụ thuộc cơ sở dữ liệu trong phát triển thử nghiệm theo hướng". Tôi đã sử dụng mẫu này kể từ khi tôi đọc bài viết với thành công lớn. Mẫu này sẽ giúp phân tách lớp dữ liệu của bạn và viết các bài kiểm tra đơn vị tốt.

Điều này sẽ yêu cầu bạn áp dụng kiến ​​trúc n-tier và tạo một lớp dữ liệu riêng biệt, nhưng về lâu dài nó đáng giá.

Đây là liên kết đến bài viết trực tuyến. Repository Pattern

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