2014-04-12 14 views
8

tôi đang đánh giá kiểm tra đơn vị sử dụng EF6 kết hợp vớiĐơn vị kiểm tra với nỗ lực và SQL CE song song không

http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effort là một tài liệu tham khảo khá tốt nhưng bây giờ tôi đang bị mắc kẹt.

Tôi có 2 dự án thử nghiệm (một cho Effort và một cho SQL CE). Nếu tôi chạy cả hai tiền phạt của nhau một cách riêng biệt. Chạy cả hai trong một hàng với Á hậu thử nghiệm ReSharper dự án thử nghiệm cuối cùng luôn thất bại. Hoặc

System.InvalidOperationException: Entity Framework là đã sử dụng một trường hợp DbConfiguration trước một nỗ lực đã được thực hiện để thêm một event handler 'Loaded' . Trình xử lý sự kiện 'Đã tải' chỉ có thể được thêm làm một phần của ứng dụng khởi động trước khi Khuôn khổ thực thể được sử dụng.

hoặc

System.InvalidOperationException: Giá trị mặc định DbConfiguration dụ được sử dụng bởi các khung Entity trước một nỗ lực đã được thực hiện để thiết lập một thể hiện sơ thẩm 'SqlCeConfiguration'.The 'SqlCeConfiguration' phải được thiết lập khi bắt đầu ứng dụng trước khi sử dụng bất kỳ tính năng nào của Entity Framework hoặc phải được đăng ký trong tệp cấu hình của ứng dụng.

Nó luôn giống nhau. Người kế thừa kế thừa cá thể DbConfiguration từ phiên bản tiền nhiệm. Làm cách nào để chạy cả dự án/cấu hình thử nghiệm mà không có tác dụng phụ?

Dưới đây là tôi DbContext lớp:

public class DataContext : DbContext 
{ 
    public DataContext(string connectionString) : base(connectionString) 
    { Configuration.LazyLoadingEnabled = false; } 

    public DataContext(DbConnection connection) : base(connection, true) 
    { Configuration.LazyLoadingEnabled = false; } 
} 

Đó là bộ ghép đo với Effort:

[TestFixtureSetUp] 
public void TestFixtureSetup() 
{ 
    EffortProviderConfiguration.RegisterProvider(); 
    var connection = DbConnectionFactory.CreateTransient(); 
    var dbContext = new DataContext(connection); 
    ... 
} 

Đó là bộ ghép đo với SQL CE:

[TestFixtureSetUp] 
public void TestFixtureSetup() 
{ 
    const string filePath = @"LocalDb.sdf"; 
    var connectionString = string.Format("Data Source={0}; Persist Security Info=False;", filePath); 
    DbConfiguration.SetConfiguration(new SqlCeConfiguration()); 

    var dbContext = new DataContext(connectionString); 
    dbContext.Database.Create(); 
    ... 
} 

SqlCeConfiguration tôi:

public class SqlCeConfiguration : DbConfiguration 
{ 
    public SqlCeConfiguration() 
    { 
     SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance); 
     SetDefaultConnectionFactory(new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0")); 
    } 
} 

Cảm ơn bạn rất nhiều!

Marcel

+0

Phương thức 'DbConfiguration.SetConfiguration()' thường chỉ cho phép một 'DbConfiguration' cho mỗi AppDomain. Bạn đã thử đặt nhà cung cấp theo cách thủ công vào chuỗi kết nối chưa, thay vì cố gắng đặt mã đó vào mã? –

+0

@martin_costello Cảm ơn bạn đã gợi ý. Rất tiếc nhà cung cấp là "từ khóa không được hỗ trợ". Bạn có nhớ cung cấp một chuỗi kết nối ví dụ cho SQL CE Server không? – Marcel

+0

[Xem thêm] (http://stackoverflow.com/questions/30730224/running-code-on-assembly-load-in-xunit/30730225) – AlexFoxGill

Trả lời

8

Chúng tôi đã nhìn thấy những lỗi tương tự khi chạy tất cả unittests về xây dựng máy chủ của chúng tôi hoặc khi chạy tất cả unittests tại địa phương.

Hệ thống.InvalidOperationException: Khuôn khổ thực thể đã được sử dụng một cá thể DbConfiguration trước khi một nỗ lực được thực hiện để thêm một trình xử lý sự kiện 'Loaded' được xử lý là . Trình xử lý sự kiện 'Đã tải' chỉ có thể được thêm làm một phần của ứng dụng khởi động trước khi Khuôn khổ thực thể được sử dụng.

Khi chúng tôi đã chuyển mã đăng ký Nhà cung cấp nỗ lực từ phương pháp [TestInitialize] sang phương thức AssemblyInitialize, mọi thứ bắt đầu hoạt động. Dựa trên thông báo trong lỗi được báo cáo, có vẻ như việc đăng ký không thể xảy ra nhiều lần.

[AssemblyInitialize()] 
    public static void AssemblyInit(TestContext context) 
    { 
     Effort.Provider.EffortProviderConfiguration.RegisterProvider(); 
    } 
0

Tôi đã xem xét điều này ngay bây giờ và nghĩ rằng tôi muốn chia sẻ nguyên nhân của vấn đề của tôi.

Mọi thứ đều hoạt động dandy, cho đến khi tôi triển khai và ActionFilter. Nó bật ra rằng trong thử nghiệm của tôi mã Effort đã được chạy sau khi instantiation của trang web của tôi. Việc khởi tạo trang web đã khởi tạo bộ lọc của tôi, bộ lọc của tôi đã yêu cầu một DataContext từ vùng chứa.

Do đó, một người nào đó đã sử dụng datacontext trước khi tôi cố định cấu hình bằng Effort.

Hy vọng điều này có thể giúp một người nào đó trong tương lai, mặc dù nó có một chút nguyên nhân khác và tôi hy vọng bạn đã giải quyết được vấn đề của mình!

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