2013-01-09 21 views
5

Tôi quan tâm đến việc viết các bài kiểm tra đơn vị (sử dụng NUnit) cho một số lớp dịch vụ được tạo bằng ServiceStack, sử dụng "API mới" (kế thừa từ ServiceStack.ServiceInterface.Service). Thuộc tính Db của dịch vụ được tự động kết nối đúng cách khi được lưu trữ trong một ứng dụng ASP.NET bằng cách sử dụng AppHost, nhưng tôi dường như không thể tìm ra kỹ thuật thích hợp khi chạy bên ngoài môi trường đó. Tôi thấy nhiều không gian tên và lớp liên quan đến thử nghiệm trong ServiceStack nhưng không thể tìm thấy một ví dụ rõ ràng khi thuộc tính Db của dịch vụ được tiêm, trái ngược với việc chỉ thiết lập một nhà máy kết nối trực tiếp và sau đó gọi các phương thức mở rộng IDbConnection khác nhau (Chèn , Chọn, v.v.).Làm cách nào để chèn Db vào các lớp Dịch vụ khi kiểm tra đơn vị ServiceStack.OrmLite với NUnit?

Tôi đã thử có lớp thử nghiệm kế thừa từ ServiceStack.ServiceInterface.Testing.TestBase và ghi đè phương thức Định cấu hình để đăng ký IDbConnectionFactory (sử dụng ": memory:"), cũng như thiết lập OrmLiteConfig.DialectProvider = SqliteDialect.Provider; trong TestFixtureSetUp của tôi, nhưng tôi tiếp tục để có được một NullReferenceException khi gọi các phương thức dịch vụ của tôi (tại ServiceStack.ServiceInterface.Service.get_Db()). Có vẻ như các container Funq không phải là tự động dây bất cứ điều gì.

Bản thân SQLite được thiết lập đúng cách, tôi có thể xác nhận với các bài kiểm tra đơn vị đơn giản bỏ qua các lớp dịch vụ của tôi và chỉ cần thực hiện các cuộc gọi IDbConnection trực tiếp.

Tôi đang thiếu gì?

Sửa

Dường như các dịch vụ đơn vị thử nghiệm ServiceStack đòi hỏi sự tồn tại của một máy chủ và một khách hàng, mặc dù có vẻ như có nhiều cách để thiết lập này để tránh những chi phí serialization (sử dụng DirectServiceClient, như được hiển thị here) - mặc dù tôi đã không thành công trong việc làm điều đó để làm việc trong trường hợp của tôi. Tôi quản lý để có được điều này làm việc bằng cách sử dụng một cách tiếp cận AppHostHttpListenerBase (xem here) mặc dù nó là nhiều hơn một bài kiểm tra tích hợp hơn một đơn vị một (và là phù hợp chậm hơn).

Trả lời

5

docs on Testing hiển thị một số phương pháp khác nhau để tiêm phụ thuộc.

Nếu bạn nhìn vào việc thực hiện đối với các cơ sở Service nó chỉ tạo ra Db từ IDbConnectionFactory:

private IDbConnection db; 
public virtual IDbConnection Db 
{ 
    get { return db ?? (db = TryResolve<IDbConnectionFactory>().OpenDbConnection()); } 
} 

Đó nó chỉ giải quyết từ địa phương hoặc toàn cầu IResolver IOC container:

public static IResolver GlobalResolver { get; set; } 

private IResolver resolver; 
public virtual IResolver GetResolver() 
{ 
    return resolver ?? GlobalResolver; 
} 

public virtual T TryResolve<T>() 
{ 
    return this.GetResolver() == null 
     ? default(T) 
     : this.GetResolver().TryResolve<T>(); 
} 

Vì vậy, để tiêm phụ thuộc của riêng bạn (khi sử dụng lớp cơ sở dịch vụ), bạn chỉ cần cấu hình IAppHost với phụ thuộc của bạn servi của bạn ces cần mà bạn có thể làm với:

using (var appHost = new BasicAppHost { 
    ConfigureContainer = c => { 
     c.Register<IDbConnectionFactory>(new ...); 
    } 
}.Init()) 
{ 
    //...  
} 

Mà sau đó bạn có thể đặt trên dịch vụ của bạn cùng với bất kỳ phụ thuộc của riêng bạn nhu cầu dịch vụ của bạn, ví dụ:

var service = appHost.ResolveService<MyService>(); 

Mà sẽ autowire tất cả phụ thuộc cấu hình trong AppHost của bạn, bạn cũng có thể thêm phụ thuộc cụ thể cho thử nghiệm adhoc của riêng mình thông qua quyền truy cập thuộc tính thông thường, e.g:

var service.MyDependency = new Mock<IMyDependency>().Object; 

Từ đó trở đi bạn chỉ có thể gọi điện và thử nghiệm các phương pháp # lớp C của bạn như bình thường:

var response = service.Get(new RequestDto { ... }); 
Assert.That(response.Result, Is.Equal("Expected Result from DB")); 
+0

này đã làm việc một cách hoàn hảo! Cảm ơn! Tôi đã phải chuyển đổi một trong những ExpectedExceptions của tôi trở lại một trong những (HttpError) bên trong từ wrapper (WebServiceException) nhưng điều đó có ý nghĩa cho rằng tôi không còn đi qua một khách hàng dịch vụ. –

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